【问题标题】:Get week period based on week number, month and year sql根据周数,月和年sql获取周周期
【发布时间】:2020-12-07 11:36:04
【问题描述】:

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

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

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

我需要返回类似的东西

10月:第一天: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)

【问题讨论】:

  • 为什么您的第一个示例在同一天开始和结束?如果您有奇数周编号,您可能需要创建一个日历表。

标签: sql tsql


【解决方案1】:

我不确定您的数据是什么样的,但如果您有一周的第一天,您可以将其按月份拆分为:

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 作为存储中间结果的一种方式,例如当月的最后一天和一周结束的时间。

【讨论】:

    【解决方案2】:
    DECLARE @d datetime;
    
    SET DATEFIRST 6;
    SET @d = '2020-11-01';
    
    WITH weektest as (
      select @d as d
      union all
      select DATEADD(DAY,1,d) from weektest where d<='2020-11-6'
    )
    SELECT 
       d, 
       DATEPART(week, d), 
       DATEPART(weekday,d),
       DATENAME(weekday,d)
    from weektest;
    

    输出:

    d                                               
    ----------------------- ----------- ----------- ------------------------------
    2020-11-01 00:00:00.000 45          2           Sunday
    2020-11-02 00:00:00.000 45          3           Monday
    2020-11-03 00:00:00.000 45          4           Tuesday
    2020-11-04 00:00:00.000 45          5           Wednesday
    2020-11-05 00:00:00.000 45          6           Thursday
    2020-11-06 00:00:00.000 45          7           Friday
    2020-11-07 00:00:00.000 46          1           Saturday
    

    【讨论】:

      猜你喜欢
      • 2020-01-22
      • 1970-01-01
      • 2012-09-22
      • 2020-12-14
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 2019-12-18
      • 2017-08-30
      相关资源
      最近更新 更多