这篇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