Oracle中判断指定日期是否为周一并获取上周一日期的方法
在Oracle中判断日期是否为周一及获取上周一的方法
一、判断指定日期是否为周一
推荐两种不受语言/地区设置影响的可靠方法:
方法1:利用ISO周截断函数TRUNC
Oracle的TRUNC(date, 'IW')会将日期截断到ISO周的周一(ISO周以周一为一周起始)。若原日期与截断后的值相等,则该日期为周一:
SELECT CASE WHEN TRUNC(TO_DATE(start_date, 'YYYY-MM-DD')) = TRUNC(TO_DATE(start_date, 'YYYY-MM-DD'), 'IW') THEN '是周一' ELSE '不是周一' END AS is_monday FROM your_table;
方法2:指定语言的TO_CHAR判断
通过NLS_DATE_LANGUAGE参数固定星期名称的语言,避免系统语言差异导致的判断错误:
SELECT CASE WHEN TO_CHAR(TO_DATE(start_date, 'YYYY-MM-DD'), 'FMDAY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'MONDAY' THEN '是周一' ELSE '不是周一' END AS is_monday FROM your_table;
注:
FM用于去除星期名称后的默认空格,确保匹配准确
二、获取上周一的日期
根据你的示例需求(如2024-02-27周二返回2024-02-26),实际是获取离指定日期最近且不晚于该日期的周一,可通过以下方式实现:
通用兼容方案
SELECT TRUNC(TO_DATE('2024-02-27', 'YYYY-MM-DD'), 'IW') AS target_monday FROM DUAL;
- 逻辑说明:
- 输入为周一(如2024-02-26)时,返回当天;
- 输入为周二至周日(如2024-02-27至2024-03-03)时,返回当周周一;
- 输入为上周日(如2024-02-25)时,返回上周周一(2024-02-19)。
严格返回“上一周的周一”
若需求为无论输入日期是否为周一,都返回上一周的周一(如输入2024-02-26周一,返回2024-02-19),可使用:
SELECT TRUNC(TO_DATE('2024-02-27', 'YYYY-MM-DD'), 'IW') - 7 AS last_week_monday FROM DUAL;
结合现有代码的整合示例
将判断逻辑与你已实现的星期获取功能整合:
SELECT start_date, TO_CHAR(TO_DATE(start_date, 'YYYY-MM-DD'), 'DAY') AS systart_day_of_week, CASE WHEN TRUNC(TO_DATE(start_date, 'YYYY-MM-DD')) = TRUNC(TO_DATE(start_date, 'YYYY-MM-DD'), 'IW') THEN '是周一' ELSE '不是周一' END AS is_monday, TRUNC(TO_DATE(start_date, 'YYYY-MM-DD'), 'IW') AS target_monday FROM your_table;
内容的提问来源于stack exchange,提问作者YellowMellow
相关产品推荐
相关产品推荐

