无法理解这个查询

时间:2013-03-04 05:42:44

标签: sql sql-server tsql

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 个答案:

答案 0 :(得分: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(月, DATEDIFF(月,0,'2013-03-04'),0)) - 1) - 1)/ 7 + 1

  • 1900-01-01,1358的月数

(DAY('2013-03-04')+(DATEPART(dw, DATEADD(月,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 ) - 1)/ 7 + 1

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

(4 + 5 - 1 )/ 7 + 1

  • -1,因为'2013-03-04'是'2013-03-01'
  • 的3天

= 2

答案 1 :(得分: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