標籤:sql server datepart()
SQL Server有一個很強大的函數:DATEPART()
它可以計算2017-10-17是屬於今年的
第幾天:select datepart(dy,‘2017-10-17‘)
第幾周:select datepart(wk,‘2017-10-17‘)
第幾月:select datepart(mm,‘2017-10-17‘)
第幾季度:select datepart(qq,‘2017-10-17‘)
一周中的星期幾:select (case datepart(dw,‘2017-10-17‘)
when 1 then ‘Sunday‘
when 2 then ‘Monday‘
when 3 then ‘Tuesday‘
when 4 then ‘Wednesday‘
when 5 then ‘Thursday‘
when 6 then ‘Friday‘
when 7 then ‘Saturday‘
end)
那麼問題來了:如果我們需要知道2017年的第25周是哪幾天,應該怎麼編寫SQL
分析:
1. 2017年第25周第1天是幾月幾號
1.1 2017年的第1周的第1天2017-1-1是星期幾
1.2 每周有7天
1.3 2017-1-1需要加上多少天等於2017年第25周第1天
那麼,第25周的第1天 = 2017年的第1周天數 + (25-2)*7,25-2即減去第1周和第25周
2、2017年第25周最後1天是幾月幾號
2017年第25周最後1天 = 2017年第25周第1天 + 6天
到了這裡,我們知道關鍵的點為如何計算2017第1周的天數,在計算天數時最關鍵的是確定星期日是一周的第1天還是最後一天。
2017年1月1日恰好是星期日
650) this.width=650;" src="https://s1.51cto.com/wyfs02/M00/08/AC/wKiom1nlp2_AiAL8AAAeGF-tKKE461.png-wh_500x0-wm_3-wmp_4-s_417669323.png" title="20170101.PNG" alt="wKiom1nlp2_AiAL8AAAeGF-tKKE461.png-wh_50" />
如果星期日是一周的第一天
2017年第25周的第1天 = 2017年1月1日 + 7天 + (25-2)*7天
SQL語句:dateadd(day,7+(25-2)*7,‘2017-1-1‘),結果為:2017-6-18
2017年第25周為:2017-6-18至2017-6-24
如果星期日是一周的最後一天
2017年第25周的第1天 = 2017年1月1日 + 1天 + (25-2)*7天
SQL語句:dateadd(day,1+(25-2)*7,‘2017-1-1‘),結果為:2017-6-12
2017年第25周為:2017-6-12至2017-6-18
接下來把上面的計算方式編寫為SQL語句
星期日為第1天:
declare @weekofyear int
declare @date datetime
declare @dayofweek int
declare @firstday varchar(20)
declare @firstweek int
set @date=‘2017-1-1‘
select @dayofweek=datepart(dw,@date)
set @weekofyear=25
set @[email protected]
declare @begin_date datetime
declare @end_date datetime
set @begin_date=dateadd(day, @firstweek+(@weekofyear-2)*7,@date)
set @end_date=dateadd(day,6,@begin_date)
星期日為最後一天:
declare @weekofyear int
declare @date datetime
declare @dayofweek int
declare @firstweek int
set @date=‘2017-1-1‘
select @dayofweek=datepart(dw,@date)
set @weekofyear=25
if([email protected])>7
begin
set @[email protected]
end
else
begin
set @[email protected]
end
declare @begin_date datetime
declare @end_date datetime
set @begin_date=dateadd(day, @firstweek+(@weekofyear-2)*7,@date)
set @end_date=dateadd(day,6,@begin_date)
再將代碼整合為預存程序,結果如下:
650) this.width=650;" src="https://s3.51cto.com/wyfs02/M01/A7/5E/wKioL1nluFuzkziGAAAgDVKTOVo222.png" title="weeksofyear.PNG" alt="wKioL1nluFuzkziGAAAgDVKTOVo222.png" />
結果驗證:
650) this.width=650;" src="https://s2.51cto.com/wyfs02/M00/08/AF/wKiom1nlutyT2dbwAAAtyZkRHWE572.png" title="201701.PNG" alt="wKiom1nlutyT2dbwAAAtyZkRHWE572.png" />
650) this.width=650;" src="https://s2.51cto.com/wyfs02/M00/A7/5E/wKioL1nluCejDkTGAAAw2Q-bTUY439.png" title="201706.PNG" alt="wKioL1nluCejDkTGAAAw2Q-bTUY439.png" />
本文出自 “aimax” 部落格,請務必保留此出處http://aimax.blog.51cto.com/11610508/1973364
如何在SQL Server計算XX年第XX周是哪幾天