如何用SQL的getdate()获取上周六至当前周五的动态日期?
解决SQL动态获取上周六到当前周五日期的问题
原代码问题分析
你提供的代码存在两处核心问题:
- 语法错误:
cast函数缺少括号,Friday字段也未正确闭合语法; - 逻辑错误:
- 计算周六的语句
dateadd(y,datediff(y,0,getdate()),-1)是取当前年份1月1日的前一天(即上一年12月31日),属于静态日期,并非动态的上周六; - 计算周五的语句是取当前周周一减3天,结果是上周六,完全不符合需求。
- 计算周六的语句
正确实现代码
以下是SQL Server环境下的正确写法,可动态获取包含当前日期的周六-周五周期的起始(上周六)和结束(当前周五):
-- 统一设置周日为一周第一天,避免DATEPART返回值差异 SET DATEFIRST 7; SELECT -- 计算上周六:当前周期周五减6天 DATEADD(DAY, -6, CASE DATEPART(WEEKDAY, GETDATE()) WHEN 7 THEN DATEADD(DAY, -1, GETDATE()) -- 若今天是周六,取昨天的周五 ELSE DATEADD(DAY, (6 - DATEPART(WEEKDAY, GETDATE())) % 7, GETDATE()) END ) AS [上周六], -- 计算当前周五 CASE DATEPART(WEEKDAY, GETDATE()) WHEN 7 THEN DATEADD(DAY, -1, GETDATE()) -- 若今天是周六,当前周五为昨天 ELSE DATEADD(DAY, (6 - DATEPART(WEEKDAY, GETDATE())) % 7, GETDATE()) END AS [当前周五];
逻辑说明
SET DATEFIRST 7:强制设置周日为一周的第一天,确保DATEPART(WEEKDAY)返回值固定:周日=1,周一=2...周五=6,周六=7;- 计算当前周五:如果今天是周六(返回值7),则当前周五为昨天;否则计算距离下一个周五的天数,得到当前周期的周五;
- 上周六直接由当前周五减6天得到,确保周期始终是连续7天的周六到周五。
内容的提问来源于stack exchange,提问作者PrestonfutureNerd
相关产品推荐
相关产品推荐

