我在我们的一个生产数据库中遇到了一个奇怪的问题。长话短说,简单的查询:
select id, trunc(stdate) from table_name where trunc(stdate) = '05-FEB-09';
未返回任何行。然而,
select trunc(stdate) from table_name where id = sought_after_id;
返回 '05-FEB-09'
。只有在我尝试之后:
update table_name set stdate = '05-FEB-09' where id = sought_after_id;
我的原始查询按预期工作:
select id, trunc(stdate) from table_name where trunc(stdate) = '05-FEB-09';
> sought_after_id, '05-FEB-09'
那么,我的 stdate 值发生了什么?
最佳答案
您应该始终将日期与日期进行比较(苹果对苹果...),而不是依赖隐式转换。
由于 TRUNC(date)
返回一个日期,您应该将它与一个日期进行比较:
select id, trunc(stdate) from table_name where trunc(stdate) = DATE '2009-02-05'
或
select id, trunc(stdate)
from table_name
where trunc(stdate) = TO_DATE('05-FEB-09', 'DD-MON-RR'))
更新 回应 Igor 的第一条评论:
依赖隐式数据转换使得查询结果依赖于多个 session 参数。如果您现在看到的结果与前几天不同,则其中一个参数一定已被修改。您可以通过不依赖隐式转换使您的查询“与 session 无关”。
值得坚持的是,您的第一个查询取决于客户端 session 的参数。如果 session 修改其默认日期显示设置 NLS_DATE_FORMAT
,您的查询将不会返回相同的结果。
相关说明,DD-MON-RR
是一种完全可以接受的显示 日期格式,但它不太适合在您的代码中使用,因为关于世纪有歧义,并且您依赖于月份的 NLS_DATE_LANGUAGE 参数。
关于sql - 奇怪的 Oracle 日期行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2132631/