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)