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

如何用Case When语句获取排除周日的昨日日期?

解决方案:排除周日的调整昨日日期 + Yes/No响应

完全可以实现!我们只需要结合日期判断函数和CASE WHEN逻辑,就能处理周日的特殊情况——当当前日期是周一的时候,自动把“昨日”替换成周六,同时还能基于历史日期返回Yes或No的响应。下面给你分不同主流数据库的具体实现示例:

MySQL 实现

SELECT
    -- 计算调整后的昨日日期
    CASE
        -- DAYOFWEEK返回1=周日,2=周一,所以周一取2天前的日期(周六)
        WHEN DAYOFWEEK(CURDATE()) = 2 THEN DATE_SUB(CURDATE(), INTERVAL 2 DAY)
        -- 其他日期直接取昨日
        ELSE DATE_SUB(CURDATE(), INTERVAL 1 DAY)
    END AS adjusted_yesterday,
    -- 基于历史日期返回Yes/No
    CASE
        WHEN history_date = (
            CASE
                WHEN DAYOFWEEK(CURDATE()) = 2 THEN DATE_SUB(CURDATE(), INTERVAL 2 DAY)
                ELSE DATE_SUB(CURDATE(), INTERVAL 1 DAY)
            END
        ) THEN 'Yes'
        ELSE 'No'
    END AS match_response
FROM your_table;

SQL Server 实现

SELECT
    -- 计算调整后的昨日日期
    CASE
        -- DATEPART(dw, ...)默认返回1=周日,2=周一
        WHEN DATEPART(dw, GETDATE()) = 2 THEN DATEADD(day, -2, GETDATE())
        ELSE DATEADD(day, -1, GETDATE())
    END AS adjusted_yesterday,
    -- 基于历史日期返回Yes/No
    CASE
        WHEN history_date = (
            CASE
                WHEN DATEPART(dw, GETDATE()) = 2 THEN DATEADD(day, -2, GETDATE())
                ELSE DATEADD(day, -1, GETDATE())
            END
        ) THEN 'Yes'
        ELSE 'No'
    END AS match_response
FROM your_table;

注意:如果你的SQL Server环境设置了周一为一周第一天(通过SET DATEFIRST 1),那么DATEPART(dw, GETDATE())=1代表周一,需要把判断条件改成WHEN DATEPART(dw, GETDATE()) = 1。

PostgreSQL 实现

SELECT
    -- 计算调整后的昨日日期
    CASE
        -- EXTRACT(DOW FROM ...)返回0=周日,1=周一
        WHEN EXTRACT(DOW FROM CURRENT_DATE) = 1 THEN CURRENT_DATE - INTERVAL '2 days'
        ELSE CURRENT_DATE - INTERVAL '1 day'
    END AS adjusted_yesterday,
    -- 基于历史日期返回Yes/No(转换为DATE类型避免时间部分干扰)
    CASE
        WHEN history_date::DATE = (
            CASE
                WHEN EXTRACT(DOW FROM CURRENT_DATE) = 1 THEN CURRENT_DATE - INTERVAL '2 days'
                ELSE CURRENT_DATE - INTERVAL '1 day'
            END
        )::DATE THEN 'Yes'
        ELSE 'No'
    END AS match_response
FROM your_table;

额外说明

如果你的需求不是基于当前日期,而是基于某个特定的目标日期字段(比如target_date)来计算调整后的“昨日”,只需要把示例中的CURDATE()/GETDATE()/CURRENT_DATE替换成你的目标字段即可。

内容的提问来源于stack exchange,提问作者Shakti Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:32:53