【问题标题】:Oracle SQL to get first day of monthOracle SQL 获取月份的第一天
【发布时间】:2025-11-30 00:45:01
【问题描述】:

要求是输入日期应该产生当月的第一天。 条件是:

  1. 如果输入的日期介于 11 月 16 日到 11 月 30 日之间,则第一天为 11 月 16 日。
  2. 如果输入的日期介于 1-nov 到 15-nov 之间,则第一天将是 01-nov。
  3. 对于所有其他月份,它应该返回相应月份的第 01 天。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    以 Tim Biegeleisen 的解决方案为基础,对其进行简化并避免日期到文本到日期的转换。注意使用TRUNC 来获取周期的第一个日期。

    SELECT
        CASE
            WHEN EXTRACT(MONTH FROM DATE_COL) = 11 AND EXTRACT(DAY FROM DATE_COL) >= 16
                THEN TRUNC(DATE_COL, 'MONTH') + 15
            ELSE TRUNC(DATE_COL, 'MONTH')
        END AS FIRST_OF_MONTH
    FROM T1
    

    【讨论】:

      【解决方案2】:

      我使用了一个冗长的CASE 表达式来处理这个问题,其中包含您在问题中提到的三种情况的逻辑。

      SELECT CASE WHEN EXTRACT(month FROM date) = 11 AND
                       EXTRACT(day FROM date) >= 16
                  THEN TO_DATE(EXTRACT(year FROM date) || '-11-16', 'yyyy-mm-dd')
                  ELSE TO_DATE(EXTRACT(year FROM date) || '-' || EXTRACT(month FROM date) ||
                                       '-01', 'yyyy-mm-dd')
             END AS newDate
      FROM yourTable
      

      【讨论】:

      • 实际上您可以跳过第二个WHEN 条件,因为“所有其他应返回本月的 1 日”意味着“在 11 月 1 日至 15 日之间然后 11 月 1 日”
      • @WernfriedDomscheit 很好的观察,我已经更新了我的查询。
      • @Tim 感谢您的超快速响应......按我的需要工作。