使用“ IN”比较日期-Oracle

时间:2018-06-21 07:34:42

标签: sql oracle oracle11g

我有一个需要根据日期过滤的表。对于我的问题,我必须过滤仅与当前日期相关的记录,而没有日期的时间部分。

为此,我使用了以下方法。查询似乎工作正常,但我想知道这种方法是否有缺陷。与查询相关的WHERE子句的一部分如下。

AND TO_CHAR(EOD_DATE,'YYYY-MM-DD') IN TO_CHAR(sysdate,'YYYY-MM-DD')

EOD_DATE是我要考虑的表中的字段。我希望记录EOD_DATE值是当前日期,而不管EOD_DATE的时间部分如何。

先谢谢您了:)

3 个答案:

答案 0 :(得分:2)

DATE数据类型精确到秒。因此:

SQL> select trunc(sysdate) d_from, trunc(sysdate + 1) - 1/(24*60*60) d_to from dual;

D_FROM              D_TO
------------------- -------------------
21.06.2018 00:00:00 21.06.2018 23:59:59

说-如果您希望能够使用EOD_DATE列上的索引-您应该考虑

where eod_date between trunc(sysdate)
                   and trunc(sysdate + 1) - 1/(24*60*60)

答案 1 :(得分:2)

您的解决方案有效,但是您正在使用双重转换来比较字符串而不是比较日期。此外,您不需要IN,而只需=

这可能是一种更好,更易读的方式:

... and trunc(sysdate) = trunc(EOD_DATE)

答案 2 :(得分:2)

只需使用TRUNC删除时间成分(或将其设置为00:00:00),然后比较日期:

WHERE TRUNC(EOD_DATE) = TRUNC(SYSDATE)