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