日期 sysdate 范围与文字日期范围之间的 Oracle

Posted

技术标签:

【中文标题】日期 sysdate 范围与文字日期范围之间的 Oracle【英文标题】:Oracle between dates sysdate range vs literal date range 【发布时间】:2019-04-30 21:05:35 【问题描述】:

情况如下:

select sysdate from dual ;

>  30-APR-19

SELECT
  count(*)
FROM 
  event_log
WHERE
  edate between to_date('04232019', 'MMDDYYYY') and to_date('04292019', 'MMDDYYYY') ;

> 1156

SELECT
  count(*)
FROM 
  event_log
WHERE
  edate between (sysdate-7) and (sysdate-1) ;

> 1276

这是一个事件日志,行带有日期标签(前几天的行数是静态的)。

我的问题 - 为什么计数不一样?我错过了什么?这两个范围之间是否存在一些语义差异?

【问题讨论】:

“edate”是 DATETIME 字段吗?这将澄清这一点。 【参考方案1】:

SYSDATE 是一个返回日期和时间分量的函数。如果你不TRUNC吃它,你会得到两个:

SQL> select sysdate,
  2         sysdate - 7 prev_week,
  3         sysdate - 1 yesterday
  4  from dual;

SYSDATE             PREV_WEEK           YESTERDAY
------------------- ------------------- -------------------
30.04.2019 23:13:14 23.04.2019 23:13:14 29.04.2019 23:13:14

SQL>

如果你TRUNC吃了它,你会得到午夜:

SQL> select trunc(sysdate) today,
  2         trunc(sysdate - 7) prev_week,
  3         trunc(sysdate - 1) yesterday
  4  from dual;

TODAY               PREV_WEEK           YESTERDAY
------------------- ------------------- -------------------
30.04.2019 00:00:00 23.04.2019 00:00:00 29.04.2019 00:00:00

SQL>

这意味着您的最后一个条件可能应该是

where edate between trunc(sysdate-7) and trunc(sysdate-1) ;

【讨论】:

完美。这解决了问题,Littlefoot。丹克肖恩! Bitte,如果有帮助我很高兴。

以上是关于日期 sysdate 范围与文字日期范围之间的 Oracle的主要内容,如果未能解决你的问题,请参考以下文章

如何减去“ Sysdate”的日期范围

PL/SQL 创建一个根据日期范围检查 SYSDATE 的触发器

月末日期范围,其中最近一天 = 系统日期

获取日期范围与列中最小日期之间的所有行

mysql日期范围查找(两个日期之间的记录)

根据月份中的某天返回日期范围