我可以在表格中看到last_update_date
为02-AUG-16
但是当我查询时:
select * from table_test where last_update_date = '02-AUG-16'
没有行返回。
我在这里做错了什么?
答案 0 :(得分:2)
要避免任何日期格式问题,请尝试使用to_date并指定格式:
select *
from table_test
where last_update_date = to_date('2016-08-02','yyyy-mm-dd');
如果这不起作用,那么要忽略任何时间问题(因为默认情况下,上述内容仅与2016-08-02 @ 12:00:00 AM匹配),您可以截断相关日期:
select *
from table_test
where trunc(last_update_date) = to_date('2016-08-02','yyyy-mm-dd');
答案 1 :(得分:2)
表中的日期并非全部在午夜,但您的NLS_DATE_FORMAT设置未显示时间;你正在进行的隐式转换正在寻找午夜。
如果你这样做:
select to_char(last_update_date, 'YYYY-MM-DD HH24:MI:SS')
from table_test
where last_update_date >= date '2016-08-02'
and last_update_date < date '2016-08-03'
您将看到每个值的时间部分。 where
子句查找指定日期或午夜之后的任何值,以及第二天午夜之前的值(尽管今天之后你不可能有任何值)。如果你刚刚做了:
select to_char(last_update_date, 'YYYY-MM-DD HH24:MI:SS')
from table_test
where last_update_date = date '2016-08-02'
或者实际上,正如你暗中所做的那样:
where last_update_date = to_date('02-AUG-16', DD-MON-RR')
您将看不到任何匹配项,因为第一个查询找到的值都不会将时间显示为00:00:00。
在查询或显示数据时,您不应该依赖会话的NLS_DATE_FORMAT设置。最好始终使用to_char()
进行展示 - 在最后一刻 - 和to_date()
进行比较,指定所需的format model或using ANSI date literals,如上所述。 (您不应该在其他NLS上回复;在这种情况下,您还假设您的NLS_DATE_LANGUAGE是英语以匹配AUG
)。
答案 2 :(得分:2)
我建议将其写成:
select *
from table_test
where last_update_date >= date '2016-08-02' and
last_update_date < date '2016-08-03';
这假定last_update_date
实际上存储为日期。请注意,在Oracle中,date
数据类型还可以包含时间组件,当您查看查询中返回的值时,该组件可能不可见。
使用date
关键字可以输入ISO标准日期格式。
>=
和<
的使用允许Oracle在last_update_date
上使用索引(如果有的话)。