的Oracle SQL - 无法获取数据

我可以看到表中的数据与last_update_date02-AUG-16的Oracle SQL - 无法获取数据

但是当我查询:

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

没有行返回。

我在这里做错了什么?

回答:

表格中的日期不都在午夜,但你的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)。

回答:

为了避免任何的日期格式问题,请尝试使用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');

回答:

我建议写这篇为:

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(如果有)的情况下使用索引。

以上是 的Oracle SQL - 无法获取数据 的全部内容, 来源链接: utcz.com/qa/265652.html

回到顶部