首页 > 解决方案 > 根据周数,月和年sql获取周周期

问题描述

我需要根据周数、年数和月数获取一周的第一天和最后一天

我的一周从星期六开始,到星期五结束 示例:年:2020 周:45

正常一周:第一天:2020-10-31 ~ 最后一天:2020-11-06

我需要返回类似的东西

十月:第一天:2020-10-31~最后一天:2020-10-31

11月:2020-11-01第一天~最后一天:2020-11-06

我的查询返回一周的最后一天:

select DATEADD (WEEK, @PcpSemana, DATEADD (YEAR,  ('20' + LEFT(@PcpPeriodo,2))-1900, 0)) - 5 as lastDayOfWeek 

我的查询返回一周的第一天

SELECT WeekStart = DATEADD(DAY, 
                        (CEILING(DATEPART(DAY, DATEADD (WEEK, @PcpSemana, DATEADD (YEAR,  ('20' + LEFT(@PcpPeriodo,2))-1900, 0)) - 5) / 7.0) - 1) * 7,
                        DATEADD(MONTH, DATEDIFF(MONTH, 0,DATEADD (WEEK, @PcpSemana, DATEADD (YEAR,  ('20' + LEFT(@PcpPeriodo,2))-1900, 0)) - 5), 0));

我正在使用 SET DATEFIRST 6
我不能进化太多

PcpPeriodo 包含 YYMM (2011) = 2020 / 11) PcpSemana 包含周数 (45) (01 ~ 53)

标签: sqltsql

解决方案


我不确定你的数据是什么样的,但如果你有一周的第一天,你可以将它分成几个月:

select weeks.*
from (values (convert(date, '2020-10-31'))) w(weekstart) cross apply
     (values (dateadd(day, 6, w.weekstart), eomonth(w.weekstart))
     ) v(weekend, eom) cross apply
     (values (w.weekstart,
              case when v1.weekend <= v1.eom then v1.weekend else v1.eom end
             ),
             (case when v1.weekend > v1.eom then dateadd(day, 1, v1.eom) end,
              case when v1.weekend > 1.eom then v1.weekend
             )
      ) weeks(weekstart, weekend)
where weeks.weekstart is not null;

这是apply用作存储中间结果的一种方式,例如当月的最后一天和一周结束的时间。


推荐阅读