使用sysdate查询TIMESTAMP(6)数据行数不符,求原因及周调度方案
问题原因及解决方案
为什么使用sysdate返回行数更少?
sysdate是Oracle的DATE类型,仅精确到秒,返回的是当前系统的具体时间(比如周日14:30执行时,sysdate就是当天14:30)。- 当你写
sysdate - 5时,得到的是5天前的同一时刻(比如周二14:30),而非需求中的周一00:00;sysdate - 1得到的是1天前的同一时刻(比如周六14:30),而非周六23:59:59。 - 这导致查询范围缩小为「周二14:30到周六14:30」,漏掉了周一00:00至周二14:30、周六14:30至23:59:59的所有数据,因此返回行数更少。
满足需求的正确SQL写法
你的需求是每周日自动执行,获取本周一00:00:00.000000至周六23:59:59.999999的数据,推荐两种可靠写法:
写法一:用截断函数精准定位周范围(推荐)
利用trunc(sysdate, 'IW')获取ISO周的周一00:00:00(IW规则下周一为每周第一天),通过< 下周一00:00避免TIMESTAMP微秒精度的遗漏问题:
select * from annual_report_order where report_order_date >= trunc(sysdate, 'IW') and report_order_date < trunc(sysdate, 'IW') + interval '6' day;
写法二:显式指定结束时间
如果需要严格匹配到周六23:59:59.999999,可以直接构造结束时间:
select * from annual_report_order where report_order_date >= trunc(sysdate, 'IW') and report_order_date <= trunc(sysdate, 'IW') + interval '5' day + interval '23:59:59.999999' second;
内容的提问来源于stack exchange,提问作者Pandora
相关产品推荐
相关产品推荐

