一個(gè)有意思的問(wèn)題:如何根據一年中的第幾周,查詢(xún)出它周六和周日對應的日期在SQL 2005&SQL2008實(shí)現這一功能,首先要了解在MSSQL,一年中周的描述。
圖1
1.周的第一天,在MSSQL中,可以通過(guò)下面的值來(lái)描述周的第一天:
美國英語(yǔ)中默認7為一周中的第一天。
通過(guò)@@Datefirst函數獲取當前周的第一天:
Select @@Datefirst As [周的第一天]
2. 2011-01-01所在的周
Select '2010-12-31' AS [日期],Datepart(week,'20101231') As [周] Union All
Select '2011-01-01',Datepart(week,'20110101') Union All
Select '2011-01-02',Datepart(week,'20110102') Union All
Select '2011-01-03',Datepart(week,'20110103')
從這里可以看出,2011-01-01是屬于2011年的第1周,2011-01-02就是第2周了 。
了解完上面兩點(diǎn)內容描述,回到題目問(wèn)題,這里取個(gè)案例,如要找第16周的周六日對應的日期,
3.按日歷圖找出第16周
Select Dateadd(week,16-1,'20110101') [2011-01-01過(guò)15周后對應的日期]
這里可以看出第16周,是從2011-04-10至2011-04-16,周六日日期是2011-04-1 & 2011-04-16
4.找出周六日出現在日歷圖中的規律
為了更能簡(jiǎn)潔的說(shuō)明,周六日在日歷圖(1-7位置)出現的規律,這里特別制作一些圖形來(lái)描述:
接下來(lái),就周六日出現的位置,進(jìn)行分析:
從上面的圖,可以簡(jiǎn)單分析出下面的算式:
從上面周六、周日位置的變化,可以觀(guān)察出,無(wú)論如何,周六日位置都是在N1-N7之間,
當周的第一天為7,周六的位置變成了N7.這里可以假設,當@@Datefirst=7,周六的等式:
N1(D)+x+(6-7)=N1(D)+6 //x表示未知,N1(D)+6表示,當@@Datefirst=7,周的第一個(gè)日期+6天就等于周六的日期
x+(6-7)=+6
x=7
這里就可以得出,當@@Datefirst=7,周六的算式:N1(D)+7+(6-7)
分析周六日的算式,可以得出,
周六:If 6>=@@Datefirst Then N1(D)+0+(6-@@Datefirst) Else N1(D)+7+(6-@@Datefirs)
周日:If 7>=@@Datefirst Then N1(D)+0+(7-@@Datefirst) Else N1(D)+7+(7-@@Datefirs)
為了更能說(shuō)明變化的規律,再看看下面周四的情況:
這里周四的位置變化,如傾斜的"N"字母,套用前面的算式可以得到:
好了,接下來(lái),很容易根據一年中的第幾周,查詢(xún)出它周六和周日對應的日期了
Declare @Week smallint,
@Date datetime
Set datefirst 7 /* 設置周的第一天 */
Set @Week=16 /* 第幾周 */
Set @Date=Dateadd(week,@Week-1,rtrim(year(getdate()))+'0101')-datepart(dw,rtrim(year(getdate()))+'0101')+1 /* 算出第16周的第一個(gè)日期 */
Select @Week As [周],
@Date+Case When 6>=@@datefirst Then 6-@@datefirst Else 7+(6-@@datefirst) End As [星期六],
@Date+Case When 7>=@@datefirst Then 7-@@datefirst Else 7+(7-@@datefirst) End As [星期日]
---另外一個(gè)不用Case的寫(xiě)法:
Select @Week As [周],
@Date+7*Sign(1-Sign(6-@@datefirst+1))+(6-@@datefirst) As [星期六],
@Date+7*Sign(1-Sign(7-@@datefirst+1))+(7-@@datefirst) As [星期日]