T-SQL 2 Tips: 1.计算任意两日期之间的周一到周日分别各有几个! 2.根据出生日期计算精确年龄!...
這兩個小技巧,不寫不知道,一寫嚇一跳!
都是看似簡單,實際做起來就懵,得仔細想一想,才能寫對!
凡是有日期運算的程序都要細心哦!
先說第二個:
2.根據出生日期精確計算年齡!
? 所謂計算精確年齡就是: 生日差一天也不能長一歲!
? 大家常用,間隔年數算作年齡! 如果需求要精確,如: 保險 之類的,就粗了!
? 當然還可引申為根據入職日期計算精確的司齡,算加薪之類的需求!
? 我起初認為很簡單,當年也寫了好幾遍才寫對!高手們也被我晃點了數次幾近暈倒!
? 不信有當年 2002-11-27 16:16:26 貼子為證:
? 《我的表中有字段出生年月日,請問怎樣根據當前日期計算該人的年齡,并填充到表的相應字段內?》
?? http://search.csdn.net/expert/topicview1.asp?id=1210302
? 書歸正傳:
declare @Birthday smalldatetime
set @Birthday ='1949-10-01'
--多用一個日期變量,為了擴展: 計算將來或過去某一時刻的當時的精確年齡 的功能!
declare @ smalldatetime
set @ = getdate()
select datediff(year,@Birthday,getdate())
?????? - case when datediff(day,dateadd(year,datediff(year,@Birthday,getdate()),@Birthday),getdate()) >= 0
?????????????????? then 0
????????????? else 1
???????? end
T-SQL UDF:
create?function GetAge(@BeginDate datetime,@EndDate datetime)
returns integer
begin
return (select datediff(year,@BeginDate,@EndDate) - case when datediff(day,dateadd(year,datediff(year,@BeginDate,@EndDate),@BeginDate),@EndDate) >= 0 then 0 else 1 end)
end
再說第一個:
1.計算任意兩日期之間的 周一 到 周日 分別各有幾個!
?? 起因來自該貼:
? 《SQL語句求當月的上班天數》
?? http://community.csdn.net/Expert/TopicView1.asp?id=3291510
?? 本來想偷懶 Google 一下,沒有滿意的結果,好像他自己也沒底!思路也不一樣!
? 《求一尖酸的算法》(有點兒同感,說起來簡單,做起來就暈)
?? http://www.itpub.net/252645.html
?? 順便說一下,我寫程序總想寫的"更通用"一些,可能答非所問了!
由于 @@datefirst 可通過 set datefirst N 設定 導致 datepart(weekday,[date]) 不確定!
所以用 datename!
因為確定的日期是周幾肯定是永遠不變的!當然不隨 datefirst 變!
所以更要用 datename!
另外按著中國人的習慣: 周日算作上周的最后一天!
如果是其他語言版本的 SQL Server 注意選用該語言版本的 周幾 的形式!
declare @b datetime
declare @e datetime
set @b = '2004-07-29'
set @e = '2004-08-05'
select @b as 開始日期,@e as 結束日期,
datediff(week
???????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????? else @b end
???????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????? else @e end
??????? ) + 1 as 跨周數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期二','星期三','星期四','星期五','星期六','星期日') then 1
?????? else 0 end
as 周一個數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期三','星期四','星期五','星期六','星期日') then 1
?????? else 0 end
- case when datename(weekday,@e) in ('星期一') then 1
?????? else 0 end
as 周二個數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期四','星期五','星期六','星期日') then 1
?????? else 0 end
- case when datename(weekday,@e) in ('星期一','星期二') then 1
?????? else 0 end
as 周三個數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期五','星期六','星期日') then 1
?????? else 0 end
- case when datename(weekday,@e) in ('星期一','星期二','星期三') then 1
?????? else 0 end
as 周四個數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期六','星期日') then 1
?????? else 0 end
- case when datename(weekday,@e) in ('星期一','星期二','星期三','星期四') then 1
?????? else 0 end
as 周五個數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期日') then 1
?????? else 0 end
- case when datename(weekday,@e) in ('星期一','星期二','星期三','星期四','星期五') then 1
?????? else 0 end
as 周六個數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@e) in ('星期一','星期二','星期三','星期四','星期五','星期六') then 1
?????? else 0 end
as 周日個數
--哇塞終于搞定了,起初沒想到的是: 竟然著實動了一番腦筋!
剩下的就是用的人可以為所欲為地將他變成 UDF SP (View) 等了!
如果你真正理解了我的思路,就可以用任何一種語言實現!
最后再作一下廣告:
http://www.microshaoft.com
http://www.csdn.net/Develop/list_article.asp?author=playyuer
送你幾個巨長的 SQL,也許狠有用,點一下,幫我加點兒人氣:
T-SQL 生成 兩個新的真正的公歷年歷
http://www.csdn.net/Develop/Read_Article.asp?Id=26447
T-SQL 生成一個簡易的 公歷年歷 T-SQL 含日期所在月及年的周次
http://www.csdn.net/Develop/Read_Article.asp?Id=26083
http://www.microshaoft.com
http://www.csdn.net/Develop/list_article.asp?author=playyuer
截止到2004-08-21 :
一共三板斧:
1,2?是?鄒建的
鄒建的想法就是截頭去尾
因為datediff不受 set datefirst 的影響,固定一周從周日到周六
所以我的想法也就是通過 @@datefirst 與 datepart(weekday,@dt) 的值,換算成固定的每周從0(星期天)到6(星期六)的數字,按下面的規則進行統計
datediff(week,@dt_begin,@dt_end) 的結果
如果是為0,表示沒有跨周
那么統計的時候,就從 @dt_begin 到 @dt_end 之間的星期x有數,其他都沒有數
如果是為1,表示跨周,但兩個周都不完整
那么統計的時候,就分別統計
??? @dt_begin 到周六的星期X的數
?? +周日到 @dt_end 之間的星期x的數
如果是>1,表示跨周,而且中間有完整的周
那么統計的時候,就分別統計
??? @dt_begin 到周六的星期X的數
?? +周日到 @dt_end 之間的星期x的數
?? +完整的周數
declare @b datetime,@e datetime
select @b='2002-8-5',@e='2008-7-15'
--查詢方式1(縱向)
select
??????? 項目='跨周數'
?,值=case when @b<@e
??then (datediff(day,@b,@e)+7)/7
??else (datediff(day,@e,@b)+7)/7 end
union all
select a.a,case b.a
?when -1 then case when a.b between b.b and b.c then 1 else 0 end
?when? 0 then case when b.b<=a.b then 1 else 0 end
??+case when b.c>=a.b then 1 else 0 end
?else b.a+case when b.b<=a.b then 1 else 0 end
??+case when b.c>=a.b then 1 else 0 end
?end
from(select a='星期一',b=1
?union all select '星期二',2 union all select '星期三',3
?union all select '星期四',4 union all select '星期五',5
?union all select '星期六',6 union all select '星期日',0
)a,(select a=case when @b<@e
??then datediff(week,@b,@e)-1
??else datediff(week,@e,@b)-1 end
?,b=case when @b<@e
??then (@@datefirst+datepart(weekday,@b)-1)%7
??else (@@datefirst+datepart(weekday,@e)-1)%7 end
?,c=case when @b<@e
??then (@@datefirst+datepart(weekday,@e)-1)%7
??else (@@datefirst+datepart(weekday,@b)-1)%7 end
?)b
--查詢方式2(橫向)
select? @b as 開始日期,@e as 結束日期
??????? ,跨周數
?,周一=case a
??when -1 then case when b=1 then 1 else 0 end
??when? 0 then case when b<=1 then 1 else 0 end
????+case when c>=1 then 1 else 0 end
??else a+case when b<=1 then 1 else 0 end
???+case when c>=1 then 1 else 0 end
??end
?,周二=case a
??when -1 then case when b=2 then 1 else 0 end
??when? 0 then case when b<=2 then 1 else 0 end
????+case when c>=2 then 1 else 0 end
??else a+case when b<=2 then 1 else 0 end
???+case when c>=2 then 1 else 0 end
??end
?,周三=case a
??when -1 then case when b=3 then 1 else 0 end
??when? 0 then case when b<=3 then 1 else 0 end
????+case when c>=3 then 1 else 0 end
??else a+case when b<=3 then 1 else 0 end
???+case when c>=3 then 1 else 0 end
??end
?,周四=case a
??when -1 then case when b=4 then 1 else 0 end
??when? 0 then case when b<=4 then 1 else 0 end
????+case when c>=4 then 1 else 0 end
??else a+case when b<=4 then 1 else 0 end
???+case when c>=4 then 1 else 0 end
??end
?,周五=case a
??when -1 then case when b=5 then 1 else 0 end
??when? 0 then case when b<=5 then 1 else 0 end
????+case when c>=5 then 1 else 0 end
??else a+case when b<=5 then 1 else 0 end
???+case when c>=5 then 1 else 0 end
??end
?,周六=case a
??when -1 then case when b=6 then 1 else 0 end
??when? 0 then case when b<=6 then 1 else 0 end
????+case when c>=6 then 1 else 0 end
??else a+case when b<=6 then 1 else 0 end
???+case when c>=6 then 1 else 0 end
??end
?,周日=case a
??when -1 then case when b=0 then 1 else 0 end
??when? 0 then case when b<=0 then 1 else 0 end
????+case when c>=0 then 1 else 0 end
??else a+case when b<=0 then 1 else 0 end
???+case when c>=0 then 1 else 0 end
??end
from(
?select 跨周數=case when @b<@e
???then (datediff(day,@b,@e)+7)/7
???else (datediff(day,@e,@b)+7)/7 end
??,a=case when @b<@e
???then datediff(week,@b,@e)-1
???else datediff(week,@e,@b)-1 end
??,b=case when @b<@e
???then (@@datefirst+datepart(weekday,@b)-1)%7
???else (@@datefirst+datepart(weekday,@e)-1)%7 end
??,c=case when @b<@e
???then (@@datefirst+datepart(weekday,@e)-1)%7
???else (@@datefirst+datepart(weekday,@b)-1)%7 end)a
--3?是?playyuer?的
select @b as 開始日期,@e as 結束日期,
datediff(week
???????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????? else @b end
???????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????? else @e end
??????? ) + 1 as 跨周數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期二','星期三','星期四','星期五','星期六','星期日') then 1
?????? else 0 end
as 周一個數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期三','星期四','星期五','星期六','星期日') then 1
?????? else 0 end
- case when datename(weekday,@e) in ('星期一') then 1
?????? else 0 end
as 周二個數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期四','星期五','星期六','星期日') then 1
?????? else 0 end
- case when datename(weekday,@e) in ('星期一','星期二') then 1
?????? else 0 end
as 周三個數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期五','星期六','星期日') then 1
?????? else 0 end
- case when datename(weekday,@e) in ('星期一','星期二','星期三') then 1
?????? else 0 end
as 周四個數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期六','星期日') then 1
?????? else 0 end
- case when datename(weekday,@e) in ('星期一','星期二','星期三','星期四') then 1
?????? else 0 end
as 周五個數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期日') then 1
?????? else 0 end
- case when datename(weekday,@e) in ('星期一','星期二','星期三','星期四','星期五') then 1
?????? else 0 end
as 周六個數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@e) in ('星期一','星期二','星期三','星期四','星期五','星期六') then 1
?????? else 0 end
as 周日個數
--======================
2004-09-11 再次匯總發現
--===========
declare @b datetime,@e datetime
set @b = '2004-9-14'
set @e = '2004-9-15'
select
?@b as 開始日期
,@e as 結束日期
,datediff(week,@b,@e) + 1
+ case when (@@datefirst + datepart(weekday,@b)) % 7 = 1 then 1 else 0 end
- case when (@@datefirst + datepart(weekday,@e)) % 7 = 1 then 1 else 0 end as 跨周數
,datediff(week,@b,@e) + case when (@@datefirst + datepart(weekday,@b)) % 7 + case when (@@datefirst + datepart(weekday,@b)) % 7 = 0 then 7 else 0 end > 2 then 0 else 1 end - case when (@@datefirst + datepart(weekday,@e)) % 7 + case when (@@datefirst + datepart(weekday,@e)) % 7 = 0 then 7 else 0 end >= 2 then 0 else 1 end as 周一數
,datediff(week,@b,@e) + case when (@@datefirst + datepart(weekday,@b)) % 7 + case when (@@datefirst + datepart(weekday,@b)) % 7 = 0 then 7 else 0 end > 3 then 0 else 1 end - case when (@@datefirst + datepart(weekday,@e)) % 7 + case when (@@datefirst + datepart(weekday,@e)) % 7 = 0 then 7 else 0 end >= 3 then 0 else 1 end as 周二數
,datediff(week,@b,@e) + case when (@@datefirst + datepart(weekday,@b)) % 7 + case when (@@datefirst + datepart(weekday,@b)) % 7 = 0 then 7 else 0 end > 4 then 0 else 1 end - case when (@@datefirst + datepart(weekday,@e)) % 7 + case when (@@datefirst + datepart(weekday,@e)) % 7 = 0 then 7 else 0 end >= 4 then 0 else 1 end as 周三數
,datediff(week,@b,@e) + case when (@@datefirst + datepart(weekday,@b)) % 7 + case when (@@datefirst + datepart(weekday,@b)) % 7 = 0 then 7 else 0 end > 5 then 0 else 1 end - case when (@@datefirst + datepart(weekday,@e)) % 7 + case when (@@datefirst + datepart(weekday,@e)) % 7 = 0 then 7 else 0 end >= 5 then 0 else 1 end as 周四數
,datediff(week,@b,@e) + case when (@@datefirst + datepart(weekday,@b)) % 7 + case when (@@datefirst + datepart(weekday,@b)) % 7 = 0 then 7 else 0 end > 6 then 0 else 1 end - case when (@@datefirst + datepart(weekday,@e)) % 7 + case when (@@datefirst + datepart(weekday,@e)) % 7 = 0 then 7 else 0 end >= 6 then 0 else 1 end as 周五數
,datediff(week,@b,@e) + case when (@@datefirst + datepart(weekday,@b)) % 7 + case when (@@datefirst + datepart(weekday,@b)) % 7 = 0 then 7 else 0 end > 7 then 0 else 1 end - case when (@@datefirst + datepart(weekday,@e)) % 7 + case when (@@datefirst + datepart(weekday,@e)) % 7 = 0 then 7 else 0 end >= 7 then 0 else 1 end as 周六數
,datediff(week,@b,@e) + case when (@@datefirst + datepart(weekday,@b)) % 7 + case when (@@datefirst + datepart(weekday,@b)) % 7 = 0 then 7 else 0 end > 1 then 0 else 1 end - case when (@@datefirst + datepart(weekday,@e)) % 7 + case when (@@datefirst + datepart(weekday,@e)) % 7 = 0 then 7 else 0 end >= 1 then 0 else 1 end as 周日數
select @b as 開始日期,@e as 結束日期,
datediff(week
???????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????? else @b end
???????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????? else @e end
??????? ) + 1 as 跨周數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期二','星期三','星期四','星期五','星期六','星期日') then 1
?????? else 0 end
as 周一數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期三','星期四','星期五','星期六','星期日') then 1
?????? else 0 end
- case when datename(weekday,@e) in ('星期一') then 1
?????? else 0 end
as 周二數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期四','星期五','星期六','星期日') then 1
?????? else 0 end
- case when datename(weekday,@e) in ('星期一','星期二') then 1
?????? else 0 end
as 周三數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期五','星期六','星期日') then 1
?????? else 0 end
- case when datename(weekday,@e) in ('星期一','星期二','星期三') then 1
?????? else 0 end
as 周四數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期六','星期日') then 1
?????? else 0 end
- case when datename(weekday,@e) in ('星期一','星期二','星期三','星期四') then 1
?????? else 0 end
as 周五數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@b) in ('星期日') then 1
?????? else 0 end
- case when datename(weekday,@e) in ('星期一','星期二','星期三','星期四','星期五') then 1
?????? else 0 end
as 周六數
????? ,datediff(week
???????????????? ,case when datename(weekday,@b) = '星期日' then @b - 1
?????????????????????? else @b end
???????????????? ,case when datename(weekday,@e) = '星期日' then @e - 1
?????????????????????? else @e end
??????????????? ) + 1
- case when datename(weekday,@e) in ('星期一','星期二','星期三','星期四','星期五','星期六') then 1
?????? else 0 end
as 周日數
?
--查詢方式2(橫向)
select? @b as 開始日期,@e as 結束日期
??????? ,跨周數
?,周一數=case a
? when -1 then case when 1 between b and c then 1 else 0 end
? when? 0 then case when b<=1 then 1 else 0 end
??? +case when c>=1 then 1 else 0 end
? else a+case when b<=1 then 1 else 0 end
?? +case when c>=1 then 1 else 0 end
? end
?,周二數=case a
? when -1 then case when 2 between b and c then 1 else 0 end
? when? 0 then case when b<=2 then 1 else 0 end
??? +case when c>=2 then 1 else 0 end
? else a+case when b<=2 then 1 else 0 end
?? +case when c>=2 then 1 else 0 end
? end
?,周三數=case a
? when -1 then case when 3 between b and c then 1 else 0 end
? when? 0 then case when b<=3 then 1 else 0 end
??? +case when c>=3 then 1 else 0 end
? else a+case when b<=3 then 1 else 0 end
?? +case when c>=3 then 1 else 0 end
? end
?,周四數=case a
? when -1 then case when 4 between b and c then 1 else 0 end
? when? 0 then case when b<=4 then 1 else 0 end
??? +case when c>=4 then 1 else 0 end
? else a+case when b<=4 then 1 else 0 end
?? +case when c>=4 then 1 else 0 end
? end
?,周五數=case a
? when -1 then case when 5 between b and c then 1 else 0 end
? when? 0 then case when b<=5 then 1 else 0 end
??? +case when c>=5 then 1 else 0 end
? else a+case when b<=5 then 1 else 0 end
?? +case when c>=5 then 1 else 0 end
? end
?,周六數=case a
? when -1 then case when 6 between b and c then 1 else 0 end
? when? 0 then case when b<=6 then 1 else 0 end
??? +case when c>=6 then 1 else 0 end
? else a+case when b<=6 then 1 else 0 end
?? +case when c>=6 then 1 else 0 end
? end
?,周日數=case a
? when -1 then case when 0 between b and c then 1 else 0 end
? when? 0 then case when b<=0 then 1 else 0 end
??? +case when c>=0 then 1 else 0 end
? else a+case when b<=0 then 1 else 0 end
?? +case when c>=0 then 1 else 0 end
? end
from(
?select 跨周數=case when @b<@e
?? then (datediff(day,@b,@e)+7)/7
?? else (datediff(day,@e,@b)+7)/7 end
? ,a=case when @b<@e
?? then datediff(week,@b,@e)-1
?? else datediff(week,@e,@b)-1 end
? ,b=case when @b<@e
?? then (@@datefirst+datepart(weekday,@b)-1)%7
?? else (@@datefirst+datepart(weekday,@e)-1)%7 end
? ,c=case when @b<@e
?? then (@@datefirst+datepart(weekday,@e)-1)%7
?? else (@@datefirst+datepart(weekday,@b)-1)%7 end)a
?
select
??????? 項目='跨周數'
?,值=case when @b<@e
? then (datediff(day,@b,@e)+7)/7
? else (datediff(day,@e,@b)+7)/7 end
union all
select a.a,case b.a
?when -1 then case when a.b between b.b and b.c then 1 else 0 end
?when? 0 then case when b.b<=a.b then 1 else 0 end
? +case when b.c>=a.b then 1 else 0 end
?else b.a+case when b.b<=a.b then 1 else 0 end
? +case when b.c>=a.b then 1 else 0 end
?end
from(select a='星期一',b=1
?union all select '星期二',2 union all select '星期三',3
?union all select '星期四',4 union all select '星期五',5
?union all select '星期六',6 union all select '星期日',0
)a,(select a=case when @b<@e
? then datediff(week,@b,@e)-1
? else datediff(week,@e,@b)-1 end
?,b=case when @b<@e
? then (@@datefirst+datepart(weekday,@b)-1)%7
? else (@@datefirst+datepart(weekday,@e)-1)%7 end
?,c=case when @b<@e
? then (@@datefirst+datepart(weekday,@e)-1)%7
? else (@@datefirst+datepart(weekday,@b)-1)%7 end
?)b
T-SQL UDF:
create function WeekdayDiff(@Weekday integer,@BeginDate datetime,@EndDate datetime)
-- @Weekday:? 1= Monday , ... ,7= Sunday
returns integer
begin
return (select datediff(week,@BeginDate,@EndDate) + case when (@@datefirst + datepart(weekday,@BeginDate)) % 7 + case when (@@datefirst + datepart(weekday,@BeginDate)) % 7 = 0 then 7 else 0 end > @Weekday % 7 + 1 then 0 else 1 end - case when (@@datefirst + datepart(weekday,@EndDate)) % 7 + case when (@@datefirst + datepart(weekday,@EndDate)) % 7 = 0 then 7 else 0 end >= @Weekday % 7 + 1 then 0 else 1 end)
end
create? function Weekday(@Date datetime)
returns integer
begin
--return: 1= Monday , ... ,7= Sunday
return (select (@@datefirst + datepart(weekday,@Date)) % 7
??????? + case when (@@datefirst + datepart(weekday,@Date)) % 7 < 2
??????????????????? then 6
?????????????? else -1
????????? end)
end
轉載于:https://www.cnblogs.com/Microshaoft/archive/2004/08/20/2485771.html
總結
以上是生活随笔為你收集整理的T-SQL 2 Tips: 1.计算任意两日期之间的周一到周日分别各有几个! 2.根据出生日期计算精确年龄!...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 毕业生求职“葵花宝典”之实习提前转正秘笈
- 下一篇: 利用apache-commons-fil