You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 20:12:46