【问题标题】:How to extract 'Week Number' and 'Day Number' from Date if Start Day is 'Monday' in a Month SQL如果开始日是一个月中的“星期一”SQL,如何从日期中提取“周数”和“日数”
【发布时间】:2019-10-05 22:24:44
【问题描述】:

我正在从日期中提取以下内容:

周数 天数

每周的开始日期是星期一。

例如日期是:“2019 年 5 月 1 日”或“2019-05-01”

然后

周数 = 1 天数 = 3

因为这一天是 2019 年 5 月 1 日星期三。

我正在使用 MS SQL Server 2012。 并使用下面的代码从网络获取周数。 我从中得到了周数,但我不明白它实际上在做什么。

select datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, @date), 0)), 0), @date - 1) + 1

谁能给我解释一下,告诉我如何提取天数。

【问题讨论】:

    标签: sql sql-server datetime


    【解决方案1】:

    无论您的@@DATEFIRST 设置如何MS Doc

    select (DATEPART(DW, @date) + @@DATEFIRST + 5) % 7 + 1 as [Day of Week]
    

    【讨论】:

      【解决方案2】:

      如果你设置datefirst,你可以这样做:

      set datefirst 1;  -- "1" = "Monday"
      
      select datepart(week, getdate()), datepart(weekday, getdate())
      

      【讨论】:

        【解决方案3】:

        其他人提到了如何获取星期几。

        就您获取每周一周的代码而言:

        select datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, @date), 0)), 0), @date - 1) + 1
        

        在我看来,它似乎得到了从第 0 天到当前日期之间经过的整月数,为我们提供了月份序列。

        然后在这个数字上加上零个月(这显然是用来将月份序列转换回代表当前月份开始的日期),给我们一个月初的日期。

        然后它获取从第 0 天到月初日期之间经过的完整周数,为我们提供周序列。

        然后将周序列转换回表示周初日期的日期,表示月初日期或之前的星期一。

        然后,它会计算上周一或前一天与当前日期前一天之间的差值(以周为单位),并加 1(因此该月的第一周表示为第 1 周)。

        这听起来像是一个合理的算法,但如果不测试和检查中间值,或者除非您从权威来源找到它,我不会认可它。

        【讨论】:

          【解决方案4】:

          检查这个-

          SELECT ISNULL(NULLIF(DATEPART(DW,GETDATE())-1,0),7)
          

          【讨论】:

            【解决方案5】:

            我已根据您的需要构建了查询。它工作正常。

            注意:星期日被视为一周中的第一天,星期六被视为一周中的第 7 天

            DECLARE @dt datetime='2019-05-01'
            DECLARE @Weekday INT
            
            if(((DATEPART(DW, @dt) + @@DATEFIRST + 5) % 7 +2) =8)
                SET @Weekday =1 
            else 
                SET @Weekday = ((DATEPART(DW, @dt) + @@DATEFIRST + 5) % 7 +2)
            
            select DATEPART(week, @dt)- DATEPART(week, CONVERT(CHAR(6), @dt, 112)+'01')+ 1 AS [Week Number], @Weekday AS [Day of Week]
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-06-29
              • 2017-07-19
              • 1970-01-01
              • 2016-11-18
              相关资源
              最近更新 更多