Sql 使用';在';比较日期-Oracle

Sql 使用';在';比较日期-Oracle,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一个需要根据日期筛选的表。对于我的问题,我必须过滤只与当前日期相关的记录,而不包括日期的时间部分 为此,我采用了以下方法。查询似乎工作正常,但我想知道这种方法是否存在任何缺陷 AND TO_CHAR(EOD_DATE,'YYYY-MM-DD') IN TO_CHAR(sysdate,'YYYY-MM-DD') EOD_DATE是我考虑的表中的字段。我希望记录EOD_DATE值在当前日期中,而不考虑EOD_DATE的时间部分 提前感谢:)日期数据类型精确到第二位。因此: SQL> se

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

为此,我采用了以下方法。查询似乎工作正常,但我想知道这种方法是否存在任何缺陷

AND TO_CHAR(EOD_DATE,'YYYY-MM-DD') IN TO_CHAR(sysdate,'YYYY-MM-DD')
EOD_DATE是我考虑的表中的字段。我希望记录EOD_DATE值在当前日期中,而不考虑EOD_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)

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)

您的解决方案是可行的,但您正在使用双重转换来比较字符串,而不是比较日期。此外,在中不需要
,而是需要一个
=

这可能是一种更好、更具可读性的方式:

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

您的解决方案是可行的,但您正在使用双重转换来比较字符串,而不是比较日期。此外,在
中不需要
,而是需要一个
=

这可能是一种更好、更具可读性的方式:

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

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

WHERE TRUNC(EOD_DATE) = TRUNC(SYSDATE)

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

WHERE TRUNC(EOD_DATE) = TRUNC(SYSDATE)