的Oracle SQL - 无法获取数据
我可以看到表中的数据与last_update_date
为02-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