tsql 与时间(周)相关的一些操作

这篇post写点与日期时间周操作有关的一些操作,也是对工作共用到的这些做一些总结。

sql server里面有个set datefirst的语句,用于设置一周的第一天。可选值为1到7。语法如下:

SET DATEFIRST { number | @number_var } 

其中number可以为数值1到7。@number_var可以为自定义的变量。如果set datefirst 1,那么每周的第一天是星期一;如果set datefirst 7,那么每周的第一天是星期日。可以写如下的代码来做个测试:

declare @st as int
set @st = 1

declare @t1 as datetime
set @t1 = '2010-09-05 00:00:00.000'

while @st <= 7
begin
	set datefirst @st
	print DATEPART(weekday, @t1)
	set @st= @st+1
end

datepart(weekday, @t1)返回的一个整数表示@t1星期几。以上的输出时7,6,5,4,3,2,1。

现在有如下需求,给一个时间,返回当前所在周的星期一和星期日两个时间。代码如下:

declare @st as int
set @st = 1

declare @t1 as datetime
set @t1 = '2010-09-05 00:00:00.000'

while @st <= 7
begin
	set datefirst @st
	
	select dateadd(dd, @st - datepart(dw, @t1), @t1) as weekStart, 
        dateadd(dd,  @st - datepart(dw, @t1) + 6 , @t1) as weekEnd
        
	set @st= @st+1
end

日期操作中,常常对星期用简写的形式表现出来,如果对于2010-9-5 来说是星期日,英语是SUNDAY,那么一般简写为SUN。现在假如在英语的环境里面,我想把星期用“星期” +“几”来表示,比如今天就是“星期日”。常用的是用case表达式,使用函数datename得到英语的星期名字,然后匹配,比如"monday"对应着“星期一”,。。。以此类推。一下提供一种方式,不适用case表达式:

declare @st as int
set @st = 1

declare @wks as nchar(30)
set @wks = N'星期一星期二星期三星期四星期五星期六星期日';

declare @t1 as datetime
set @t1 = '2010-09-05 00:00:00.000'

declare @loop as int
set @loop = 1

while @loop <= 10
begin	
	select *, substring(@wks, isnull(nullif((@st+wd-1)%7, 0),7) * 3-2, 3)
	from(
	select @t1 as date, datepart(weekday, @t1) as wd, datename(weekday, @t1) wkn
	) as P
        
	set @t1 = DATEADD(day, 1, @t1)
	set @loop = @loop + 1
end
posted @ 2010-09-05 15:18  冯小诺  阅读(585)  评论(0编辑  收藏  举报