【问题标题】:oracle date time function errororacle日期时间函数错误
【发布时间】:2013-01-25 21:02:09
【问题描述】:

我正在关注 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

【问题讨论】:

  • end_time的数据类型是什么?是date 吗?还是varchar2?还是别的什么?
  • 它是 VARCHAR2 (40 BYTE)
  • 如果要将 END_TIME 与 2 个 Date 类型进行比较,为什么要将其转换回字符串?
  • end_time的格式是什么? 'YYYY-MON-DD' 也是?如果您在 to_date 中指定 end_time 会发生什么?等等,你为什么要把它变成字符?
  • 这也给了我同样的错误:- SELECT to_date(END_TIME, 'DD-MON-YYYY')FROM STGDBA.INTERACTIONS

标签: oracle datetime


【解决方案1】:

首先,您不应该使用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),这将不是问题)。

【讨论】:

  • 谢谢你的解释非常好,而且很有意义。我也运行了上面的 qry,它返回 0 recs。我尝试了下面的 qry select to_date(substr(END_TIME,1,length(end_time)-4), 'YYYY-MM-DD HH24:MI:SS' ) FROM STGDBA.INTERACTIONS 并以低于 10/24/ 的格式返回2011 8:46:31 AM,我还需要把时间和我的日期放在一起吗?
  • @user1683763 - 运行该查询时显示给您的字符串格式无关紧要。它基于会话的NLS_DATE_FORMAT 或您使用的任何客户端工具的配置。如果查询未返回您期望的数据,您需要向我们展示源数据并告诉我们您期望的输出。
  • 源数据如下:- END_DATE :- 2011-10-24 08:46:31.621
  • 我调整了 teh qry lil 位,非常感谢 Justin。
猜你喜欢
  • 2013-03-02
  • 2012-11-13
  • 1970-01-01
  • 2015-10-11
  • 2015-10-23
  • 2021-09-26
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多