我有一个需要根据日期过滤的表。对于我的问题,我必须过滤仅与当前日期相关的记录,而没有日期的时间部分。
为此,我使用了以下方法。查询似乎工作正常,但我想知道这种方法是否有缺陷。与查询相关的WHERE
子句的一部分如下。
AND TO_CHAR(EOD_DATE,'YYYY-MM-DD') IN TO_CHAR(sysdate,'YYYY-MM-DD')
EOD_DATE是我要考虑的表中的字段。我希望记录EOD_DATE值是当前日期,而不管EOD_DATE的时间部分如何。
先谢谢您了:)
答案 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)