2016-08-02 55 views
0

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

但是当我查询:

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

没有行返回。

我在这里做错了什么?

+0

该字段的数据类型是什么? –

+0

检查last_update_date列的日期格式。 – MMK

+0

它的日期类型.. –

回答

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)。

+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

'TRUNC(LAST_UPDATE_DATE)'防止在该列中的任何索引被使用(除非你有一个功能 - 截断值的基于索引的索引)。它会工作,但效率会比它低。 –

+1

嗨詹姆斯,第二个查询的实际工作..谢谢...... –

+0

@learningKid - 而第二个查询不工作,请注意亚历克斯·普尔的评论。 Gordon展示了一个“更长”的答案(更多打字),但他解释了与Alex相同的东西 - 如果需要高效处理,最好不要使用“trunc()”(简单的方法)。 – mathguy

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

+0

谢谢戈登的帮助:) –