首页 文章

oracle日期时间函数错误

提问于
浏览
0

我正在研究跟踪sql并在日期部分保持错误

我得到的错误是: - ORA-01861:文字与格式字符串不匹配

SELECT COUNT(*) 
  FROM  STGDBA.INTERACTIONS
  WHERE APP_ID='Home Depot'
  AND PEGA_ID ='0'
  AND TO_CHAR(to_date(END_TIME))BETWEEN TO_DATE('2012-AUG-01', 'YYYY-MON-DD')AND TO_DATE
('2012-AUG-31', 'YYYY-MON-DD')

这是日期存储在数据库中的方式: - 2011-10-24 08:46:31.621

1 回答

  • 2

    首先,您不应该使用 VARCHAR2 数据类型将日期或时间戳数据存储在表中 . 您应始终使用正确的数据类型( datetimestamptimestamp with time zone 等) . 将数据存储在错误的数据类型中会导致性能问题(优化程序的基数估计通常不那么准确,索引列变得更加成问题)以及当某些应用程序无意中存储字符串时很难找到的错误表格中的格式错误导致各种查询开始抛出错误,或者执行计划中的细微更改导致错误突然开始(或停止)出现 .

    其次,假设表中每一行中的每个 end_time 字符串(无论其他两个谓词是否满足)的格式为 YYYY-MM-DD HH24:MI:SS.FFF

    SELECT COUNT(*) 
      FROM  STGDBA.INTERACTIONS
      WHERE APP_ID='Home Depot'
      AND PEGA_ID ='0'
      AND to_date(substr(END_TIME,1,length(end_time)-4), 
                  'YYYY-MM-DD HH24:MI:SS' ) BETWEEN TO_DATE('2012-AUG-01', 'YYYY-MON-DD')
                                                AND TO_DATE('2012-AUG-31', 'YYYY-MON-DD')
    

    您总是希望将日期与日期和字符串与字符串进行比较,这样您就不希望用 to_char 包装表达式的左侧 . 你总是想在调用 to_date 时指定显式格式掩码,这就是我在这里做的 . 并且 date 没有亚秒精度,因此您必须去掉小数秒(如果您将 end_time 声明为 timestamp(3) ,这将不会成为问题) .

相关问题