0
declare @date varchar(30) =  '2013-04-18'

DECLARE @WeekOfMonth TINYINT
SET @WeekOfMonth = 
    (
      DAY(@DATE) + 
      (DATEPART(dw, 
                DATEADD (MONTH, 
                         DATEDIFF (MONTH, 
                                   0, 
                                   @DATE),
                         0)) 
       - 1) -1) / 7 + 1

print @WeekOfMonth

这是我在互联网上找到的一个查询,用于找出当月的周数,例如今天的“2013-03-04”,这是本月的第二周,查询工作正常,但我无法理解它和在该博客上发布它的人也没有描述它的工作原理。有人可以帮助我更好地理解它。

4

2 回答 2

2

计算该月的周数,将天数该月第一天的工作日数相加,然后除以 7 并加 1。例如,使用 '2013-03-04',天数是4、'2013-03-01'的周数是6(星期五),所以结果是(4 + 6 - 1 - 1)/7 + 1 = 2。

从内到外工作:

(DAY('2013-03-04') + (DATEPART(dw, DATEADD(MONTH, DATEDIFF(MONTH, 0, '2013-03-04') , 0)) - 1) - 1) / 7 + 1

  • 从 1900 年 1 月 1 日到 1358 年的月数

(DAY('2013-03-04') + (DATEPART(dw, DATEADD(MONTH, 1358, 0) ) - 1) - 1) / 7 + 1

  • 从 1900-01-01、2013-03-01 起 1358 个月的日期

(DAY('2013-03-04') + ( DATEPART(dw, '2013-03-01') - 1) - 1) / 7 + 1

  • '2013-03-01' 的星期几,6(星期五)

( DAY('2013-03-04') + (6 - 1) - 1) / 7 + 1

  • '2013-03-04'的一天部分,4

(4 + (6 - 1 ) - 1) / 7 + 1

  • -1 将星期日 = 第 1 天转换为星期一 = 第 1 天

(4 + 5 - 1 ) / 7 + 1

  • -1 因为“2013-03-04”距离“2013-03-01”还有 3 天

= 2

于 2013-03-04T06:17:08.957 回答
2

这是看待这个问题的另一种方式:

您可以运行这些语句来自己分解它:

select datediff(month, 0, getdate()); -- Get Months since 1900-01-01
select DATEADD (MONTH, DATEDIFF (MONTH, 0, getdate()),0); -- Add Months back to 1900-01-01 to get 1st of Month (essentially stripping time and days)
select DATEPART(dw,DATEADD (MONTH, DATEDIFF (MONTH, 0, getdate()),0)-1); Get Day of Week Number for 1st of Current Month
select (day(getdate()) + DATEPART(dw,DATEADD (MONTH, DATEDIFF (MONTH, 0, getdate()),0)-1)-1); -- Add Day Number of Month for Current Date then subtract 1 to make it days, since we started on 1st
select (day(getdate()) + DATEPART(dw,DATEADD (MONTH, DATEDIFF (MONTH, 0, getdate()),0)-1)-1)/7; -- Determine how many whole weeks can be divided into this result
select (day(getdate()) + (DATEPART(dw,DATEADD (MONTH, DATEDIFF (MONTH, 0, getdate()),0))-1)-1)/7+1; -- We're zero indexed (meaning results would be zero in 1st week), so add 1 to get week number
于 2013-03-04T06:43:19.043 回答