【发布时间】:2025-11-30 00:45:01
【问题描述】:
要求是输入日期应该产生当月的第一天。 条件是:
- 如果输入的日期介于 11 月 16 日到 11 月 30 日之间,则第一天为 11 月 16 日。
- 如果输入的日期介于 1-nov 到 15-nov 之间,则第一天将是 01-nov。
- 对于所有其他月份,它应该返回相应月份的第 01 天。
【问题讨论】:
要求是输入日期应该产生当月的第一天。 条件是:
【问题讨论】:
以 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
【讨论】:
我使用了一个冗长的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 日”