如何用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
相关产品推荐
相关产品推荐

