Oracle日期比较查询未按预期执行

时间:2014-02-11 22:36:55

标签: sql oracle

我在查询中遇到以下情况:

AND support_version_valid_from_dt >= to_date(to_char(
    support_version_valid_from_dt, 'yyyy/mm/dd HH:MI:SS'))

我收到错误:[错误]执行(18:17):ORA-01861:文字与格式字符串不匹配 所以我尝试了这个。但这不起作用。我不明白解析oracle的日期。特别是比较日期。有人可以帮我理解oracle中查询日期比较的关键问题吗?

select  to_date(to_char(sysdate, 'yyyy/mm/dd HH:MI:SS'))
 from dual

2 个答案:

答案 0 :(得分:1)

TO_DATETO_CHAR的倒数。如果您至少输入date

,这应该可行
to_date(to_char(input_date, 'yyyy/mm/dd HH:MI:SS'), 'yyyy/mm/dd HH:MI:SS')

这会将date转换为char并返回。

即使它应该起作用,也不完全清楚你为什么要这样做:)

答案 1 :(得分:0)

您应该将日期与日期进行比较,而不是将日期存储或比较为字符串。

执行此操作时:

to_date(to_char(sysdate, 'yyyy/mm/dd HH:MI:SS'))

...您正在使用显式格式模型将DATE数据类型转换为字符串,然后在没有显式格式模型的情况下将该字符串转换回DATE;所以它隐式使用你的会话NLS设置。你有效地做了:

to_date(to_char(sysdate, 'yyyy/mm/dd HH:MI:SS'), '<NLS_DATE_FORMAT>')

除非您的NLS_DATE_FORMAT恰好与您使用的显式模型相同,否则可能会出错。例如,它的常见值可能是DD-MON-RRRR;如果你将它插入你的查询,你可能会得到相同的ORA-01861。

您的实际NLS设置并不重要。你永远不应该依赖那个价值,因为运行你代码的其他人可能有不同的设置,所以你按摩为你工作的东西仍然会失败。 (令我惊讶的是,有多少人忽略了这一点并假设将来不会出现这样的事情。)

所有这些都有点无关紧要。您将日期转换为字符串并返回日期,这在很大程度上是毫无意义的。有时候这样做是为了减少日期值的时间部分,但是你甚至没有在这里做到这一点,你可以使用trunc来实现这一点。

在您的情况下,根据您的评论而不是:

AND to_char(support_version_valid_from_dt, 'yyyy/mm/dd HH:MI:SS') >=
    to_date('2014/02/11 05:44:31', 'HH:MI:SS')

...将列值(左侧)保留为日期:

AND support_version_valid_from_dt >=
    to_date('2014/02/11 05:44:31', 'YYYY/MM/DD HH24:MI:SS')

您必须包含整个格式模型;你已经省略了实际的日期部分,你不能只选择一些模型(在这种情况下的时间)。我还将HH更改为HH24;没有它你就不能在中午之后传递,因为你没有AM / PM指示器。