Oracle SQL - 无法获取数据

时间:2016-08-02 16:00:23

标签: sql oracle

我可以在表格中看到last_update_date02-AUG-16

的数据

但是当我查询时:

select * from table_test where last_update_date = '02-AUG-16'

没有行返回。

我在这里做错了什么?

3 个答案:

答案 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 modelusing 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上使用索引(如果有的话)。