2010-06-08 78 views
7
updated_date = 08-Jun-2010; 

我有这样小于或等于的Oracle SQL

select * from asd whre updated_date <= todate('08-Jun-2010', 'dd-MM-yy'); 

查询,但我没有得到任何结果。它只适用于如果todate是09年6月9日...

即我的equalto运营商不能正常工作。

这是为什么呢?

回答

21

在Oracle中,DATE是一个时间点。它总是有一个时间组件,精确到秒。 todate('08-Jun-2010', 'dd-Mon-yyyy')在Oracle中与todate('08-Jun-2010 00:00:00', 'dd-Mon-yyyy hh24:mi:ss')相同。因此,如果您选择截至该日期的行,那么当天不会获得任何行,并且时间分量不等于00:00

如果您想选择所有行直至并包括08-JUN-2010,我会建议使用:

< to_date('09-06-2010', 'dd-MM-yyyy') 

<= to_date('08-06-2010 23:59:59', 'dd-MM-yyyy hh24:mi:ss') 

注意 - 我纠正你的日期格式:你需要如果您想使用缩写的月份名称,请使用MON。我建议使用MM来代替,以便在有人更改其客户端设置时(NLS_DATE_LANGUAGE),您不会收到错误消息。还优选使用YYYY而不是YY

+1

我觉得一个月格式的缩写名称为“MON”而不是“MMM” – Sujee 2010-06-08 11:58:55

+0

+1使用“MM”代替“一个月的缩写名”的格式的原因。 – Sujee 2010-06-08 12:04:24

+0

@Sujee:谢谢我已经更新了我的答案 – 2010-06-08 12:54:01

13

检查这一点,

select to_date('08-Jun-2010', 'dd-MON-yyyy') from dual; 

它等于2010-06-08 00:00:00。注意时间。

updated_date有时间部分。包括他们,请使用此查询,

select * from asd where trunc(updated_date) <= to_date('08-Jun-2010', 'dd-MON-yyyy'); 

默认TRUNC功能日期参数将删除的时间。

参考Trunc