2017-04-11 65 views
0

什么是Oracle查询为CURRENT_DATE 获取数据的列END_DATE就像下面Oracle查询不给结果为CURRENT_DATE

end_date 
27-10-16 03:35:00.000000000 PM 
23-11-16 11:15:00.000000000 AM 
02-11-16 03:00:00.000000000 PM 
08-11-16 09:00:00.000000000 AM 

像我运行下面的查询

Select * from table1 
where end_date < TO_DATE('2017-04-11 00:00:00', 'YYYY-MM-DD HH24:MI:SS') 

它正在运行成功,但是当我用当前日期替换查询...它没有给出结果

Select * from table1 
where end_date < TO_DATE(current_date, 'YYYY-MM-DD HH24:MI:SS') 

有人能告诉我什么是第二个查询没有给结果的原因。

+1

*** *** NEVER'调用TO_DATE()'就已经是一个'date'的值。它会将'date'转换为'varchar',以将其转换回到它开头的'date'。 –

回答

0

查询工作就像这样去:

Select * from table1 
    where trunc(end_date) < trunc(sysdate) 

TRUNC用于将两个日期比较,并获取结果。

+0

'trunc'可以去除日期的时间部分。而已。 – Nitish

+0

@Nitesh sysdate是根据时间和去除时间部分给出实际结果,trunc是有帮助的。 – dhS

+0

但是用问题中给出的数据,即使你忽略了'trunc',它也可以工作。 – Nitish

2

CURRENT_DATE返回日期。没有必要使用TO_DATE。下面的查询应该足够了。

Select * from table1 
    where end_date < current_date; 

如果你运行下面的查询,你会明白你出了什么问题。年成为0011

SELECT TO_DATE(current_date, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL; 

请注意:CURRENT_DATE返回在会话时区的当前日期。 SYSDATE返回为数据库所在的操作系统设置的当前日期和时间。这意味着CURRENT_DATESYSDATE可以返回不同的结果。你可以看看this

0

CURRENT_DATE已经是DATE值。如果需要,您可以使用to_char来格式化输出。

end_date < CURRENT_DATE应该做的工作。或者您可以相应地设置nls参数以获得更好的可读性。

如果你只比较日期,没有时间戳,你可以用trunc()

+0

感谢您的信息 – dhS