Oracle SQL需求:平日查昨日数据,周一查周五至周日数据
Oracle SQL 实现平日/周一差异化数据查询
直接在WHERE子句里用逻辑分支+日期函数就能实现需求,不用CASE语句,完整SQL如下:
SELECT * FROM My_Data WHERE -- 非周一:仅取昨日数据 (TRUNC(SYSDATE) != TRUNC(SYSDATE, 'IW') AND TRUNC(TO_DATE(My_Data.Date, 'YYYY-MM-DD')) = TRUNC(SYSDATE) - 1) OR -- 周一:取周五至周日的数据(即当前日期往前推3天到1天) (TRUNC(SYSDATE) = TRUNC(SYSDATE, 'IW') AND TRUNC(TO_DATE(My_Data.Date, 'YYYY-MM-DD')) BETWEEN TRUNC(SYSDATE) - 3 AND TRUNC(SYSDATE) - 1)
关键细节说明:
- 可靠判断周一:用
TRUNC(SYSDATE, 'IW')获取ISO周的周一(ISO标准以周一为每周第一天,不受数据库地区语言设置影响,避免了TO_CHAR(SYSDATE, 'DY')因语言差异导致的判断错误),和TRUNC(SYSDATE)对比即可确定当天是否为周一。 - 日期维度匹配:用
TRUNC()截断日期的时分秒部分,确保仅按日期维度匹配,避免因时间戳差异漏取数据。 - 字段类型优化:如果
My_Data.Date本身是DATE类型,直接用TRUNC(My_Data.Date)即可,无需TO_DATE转换,能提升查询效率。
内容的提问来源于stack exchange,提问作者Roundup
相关产品推荐
相关产品推荐

