You need to enable JavaScript to run this app. Oracle SQL 如何编写查询获取每年截至当年当日的YTD记录
优惠活动
大模型
产品
解决方案
定价
更多

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 → 命中
      和你预期的返回结果完全一致。

闰年特殊场景兼容

如果你的数据存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 03:45:02