Oracle SQL 如何编写查询获取每年截至当年当日的YTD记录
Oracle SQL按当年当日筛选记录的写法
你要实现的是忽略年份,仅对比日期字段的月日部分是否小于等于当前系统日期的月日,直接用字符串转义对比即可,写法如下:
SELECT date_field FROM 你的表名 WHERE TO_CHAR(date_field, 'MMDD') <= TO_CHAR(SYSDATE, 'MMDD');
逻辑说明
- 用
TO_CHAR(date_field, 'MMDD')把日期转换为四位月日格式的字符串,比如7月21日会转为0721,12月31日会转为1231 - 直接对比两个字符串的大小即可得到符合要求的结果,你给出的示例验证如下:
若2021年7月21日执行查询,当前日期转义结果为0721:- 01/01/2010 →
0101≤0721→ 命中 - 12/31/2010 →
1231>0721→ 不命中 - 01/01/2021 →
0101≤0721→ 命中 - 07/21/2021 →
0721≤0721→ 命中
和你预期的返回结果完全一致。
- 01/01/2010 →
闰年特殊场景兼容
如果你的数据存在2月29日的记录,且非闰年2月28日查询时需要将2月29日视为有效命中,可以使用下面的写法:
SELECT date_field FROM 你的表名 WHERE EXTRACT(MONTH FROM date_field) < EXTRACT(MONTH FROM SYSDATE) OR ( EXTRACT(MONTH FROM date_field) = EXTRACT(MONTH FROM SYSDATE) AND EXTRACT(DAY FROM date_field) <= CASE WHEN EXTRACT(MONTH FROM SYSDATE) = 2 AND EXTRACT(DAY FROM SYSDATE) = 28 AND MOD(EXTRACT(YEAR FROM date_field),4)=0 THEN 29 ELSE EXTRACT(DAY FROM SYSDATE) END );
没有闰年特殊需求的话用第一种写法即可,性能和可读性都更好。
内容的提问来源于stack exchange,提问作者Christopher
相关产品推荐
相关产品推荐

