我在查询中遇到以下情况:
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
答案 0 :(得分:1)
TO_DATE
是TO_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指示器。