T-SQL 生成一个简易的 公历年历 T-SQL 含日期所在月及年的周次

王朝mssql·作者佚名  2006-01-09
宽屏版  字体: |||超大  

--增加了日期所在月及年的周次!

--星期日要算在"上一周"!(注意 WeekOfYear、WeekOfMonth 与 MyWeekOfYear、MyWeekOfMonth 的区别)

--注意 datename 的值会因 SQL Server 语言版本或日期格式有所差异!

--本测试环境为: SQL Server 2000 简体中文版 + Windows 简体中文版

declare @ datetime

set @ = '1995-02-25 11:00:50' -- 1995-01-01 正好是个星期日

select @ as 日期

,dateadd(year,datediff(year,0,@),0) as 所在年的第一天

,dateadd(year,1+datediff(year,0,@),0)-1 as 所在年的最后一天

,dateadd(quarter,datediff(quarter,0,@),0) as 所在季的第一天

,dateadd(quarter,1+datediff(quarter,0,@),0)-1 as 所在季的最后一天

,dateadd(month,datediff(month,0,@),0) as 所在月的第一天

,dateadd(month,1+datediff(month,0,@),0)-1 as 所在月的最后一天

,dateadd(week,datediff(week,0,@),0) as 所在周的第一天

,dateadd(week,1+datediff(week,0,@),0)-1 as 所在周的最后一天

select dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0))))) as [Date]

,datename(weekday,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))) as [WeekDayName]

,datepart(weekday,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))) as [WeekDay]

,datepart(week,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))) as WeekOfYear

,datediff

(

week

,case when datename(weekday,dateadd(day,0,datediff(day,0,dateadd(year,datediff(year,0,@),0)))) = '星期日'

then dateadd(day,-1,dateadd(day,0,datediff(day,0,dateadd(year,datediff(year,0,@),0))))

else dateadd(day,0,datediff(day,0,dateadd(year,datediff(year,0,@),0)))

end

,case when datename(weekday,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))) = '星期日'

then dateadd(day,-1,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0))))))

else dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))

end

)

+ 1 as MyWeekOfYear

,datediff(week,dateadd(day,1-day(dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))),dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))),dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))) +1 as WeekOfMonth

,datediff

(week

,case when datename(weekday,dateadd(day,1-day(dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))),dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))))= '星期日'

then dateadd(day,-1,dateadd(day,1-day(dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))),dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))))

else dateadd(day,1-day(dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))),dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0))))))

end

,case when datename(weekday,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))) = '星期日'

then dateadd(day,-1,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0))))))

else dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))

end

)

+1 as MyWeekOfMonth

,datepart(dayofyear,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))) as DayOfYear

into D

from

(

select 0 as i

union all

select 1

union all

select 2

union all

select 3

union all

select 4

union all

select 5

union all

select 6

union all

select 7

union all

select 8

union all

select 9

union all

select 10

union all

select 11

) M

,

(

select 0 as i

union all

select 1

union all

select 2

union all

select 3

union all

select 4

union all

select 5

union all

select 6

union all

select 7

union all

select 8

union all

select 9

union all

select 10

union all

select 11

union all

select 12

union all

select 13

union all

select 14

union all

select 15

union all

select 16

union all

select 17

union all

select 18

union all

select 19

union all

select 20

union all

select 21

union all

select 22

union all

select 23

union all

select 24

union all

select 25

union all

select 26

union all

select 27

union all

select 28

union all

select 29

union all

select 30

) d

where datediff(month,dateadd(year,datediff(year,0,@),0),dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))) = m.i

order by [Date]

select month(min(date))

,(select min(date)

from d

where datepart(week,date) = datepart(week,a.date) and datename(weekday,date)='星期日' and datediff(month,min(a.date),date) = 0) as 星期日

, (select min(date)

from d

where datepart(week,date) = datepart(week,a.date) and datename(weekday,date)='星期一' and datediff(month,min(a.date),date) = 0) as 星期一

,(select min(date)

from d

where datepart(week,date) = datepart(week,a.date) and datename(weekday,date)='星期二' and datediff(month,min(a.date),date) = 0) as 星期二

,(select min(date)

from d

where datepart(week,date) = datepart(week,a.date) and datename(weekday,date)='星期三' and datediff(month,min(a.date),date) = 0) as 星期三

,(select min(date)

from d

where datepart(week,date) = datepart(week,a.date) and datename(weekday,date)='星期四' and datediff(month,min(a.date),date) = 0) as 星期四

,(select min(date)

from d

where datepart(week,date) = datepart(week,a.date) and datename(weekday,date)='星期五' and datediff(month,min(a.date),date) = 0) as 星期五

,(select min(date)

from d

where datepart(week,date) = datepart(week,a.date) and datename(weekday,date)='星期六' and datediff(month,min(a.date),date) = 0) as 星期六

from d a

group by datediff(month,0,date),datepart(week,date)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有