SQL Server中按指定条件从s_term、w_due提取对应短日期的实现方法
SQL Server 实现日期提取方案
核心思路
- 固定每周起始日为周一,避免系统默认配置干扰计算结果
- 先算出目标年份8月第一个周一的基准日期
- 按照业务规则计算偏移周数,得到目标日期后转换为
dd-mm-yyyy格式即可
完整实现代码
-- 设置周起始为周一(参数1对应周一,避免系统默认周起始规则影响) SET DATEFIRST 1; -- 定义目标年份,默认取当前年份,可按需修改为固定值 DECLARE @TargetYear INT = YEAR(GETDATE()); -- 计算当年8月1日的日期 DECLARE @AugFirst DATE = DATEFROMPARTS(@TargetYear, 8, 1); -- 计算8月第一个周一的基准日期 DECLARE @FirstMonOfAug DATE = DATEADD(DAY, (1 - DATEPART(WEEKDAY, @AugFirst) + 7) % 7, @AugFirst); -- 关联业务表计算目标日期 SELECT s_term, w_due, -- 转换为dd-mm-yyyy格式 FORMAT( DATEADD(WEEK, CASE WHEN s_term = 2 AND w_due = 2 THEN (2-1) + w_due -- 第2个周一偏移1周,加步长2周,总偏移3周 WHEN s_term = 4 AND w_due = 2 THEN (4-1) + w_due -- 第4个周一偏移3周,加步长2周,总偏移5周 ELSE 0 -- 其他业务规则可在此处扩展 END, @FirstMonOfAug ), 'dd-MM-yyyy' ) AS target_date FROM 你的业务表名;
注:如果使用SQL Server 2012以下版本,把FORMAT函数替换为
CONVERT(VARCHAR(10), 目标日期, 105)即可得到相同格式的结果。
结果验证
以2024年为例,执行后返回结果如下:
- s_term=2、w_due=2时,返回
26-08-2024(对应8月第4个周一) - s_term=4、w_due=2时,返回
09-09-2024(对应9月第2个周一)
如果需要适配其他年份,仅需修改@TargetYear变量的赋值即可,无需调整其他逻辑。
内容的提问来源于stack exchange,提问作者Bulls
相关产品推荐
相关产品推荐

