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」で、今月の第 2週のように、月の週番号を調べるためにインターネットで見つけたクエリです。クエリは正常に機能していますが、理解できません。そのブログに投稿した人も、それが機能しているとは述べていません。誰かがそれをよりよく理解するのを手伝ってくれませんか。

4

2 に答える 2

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 に答える
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-01-01 からの月数 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

  • '2013-03-04' は '2013-03-01' から 3 日なので -1

= 2

于 2013-03-04T06:17:08.957 に答える