1:每个月的第一天 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 最核心的函数是getdate(),大部分人都知道这个是返回当前的日期和时间的函数。下一个执行的函数DATEDIFF(mm,0,getdate())是计算当前日期和“1900-01-01 00:00:00.000”这个日期之间的月数。记住:时期和时间变量和毫秒一样是从“1900-01-01 00:00:00.000”开始计算的。这就是为什么你可以在DATEDIFF函数中指定第一个时间表达式为“0”。下一个函数是DATEADD,增加当前日期到“1900-01-01”的月数。通过增加预定义的日期“1900-01-01”和当前日期的月数,我们可以获得这个月的第一天。另外,计算出来的日期的时间部分将会是“00:00:00.000”。 2:本周的星期一 SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) 3:一年的第一天 SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) 4:季度的第一天 SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) 5:当天的半夜 SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0) 6:上个月的最后一天 SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
7:去年的最后一天 SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) 8:本月的最后一天 为了获得本月的最后一天,稍微修改一下获得上个月的最后一天的语句。修改需要给用DATEDIFF比较当前日期和“1900-01-01”返回的时间间隔上加1。通过加1个月,我计算出下个月的第一天,然后减去3毫秒,这样就计算出了这个月的最后一天。 SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) 9:本年的最后一天 SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。 10:本月的第一个星期一 Select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,6-datepart(day,getdate()),getdate()) ), 0) 在这个例子里,使用了“本周的星期一”的脚本,并作了一点点修改。修改的部分是把原来脚本中“getdate()”部分替换成计算本月的第6天,在计算中用本月的第6天来替换当前日期使得计算可以获得这个月的第一个星期一。
11:其他 1:去掉时分秒 declare @ datetime set @ = getdate() --’2003-7-1 10:00:00’ SELECT @,DATEADD(day, DATEDIFF(day,0,@), 0) 2)显示星期几 select datename(weekday,getdate()) 3)如何取得某个月的天数 declare @m int set @m=2 --月份 select datediff(day,’2003-’+cast(@m as varchar)+’-15’ ,’2003-’+cast(@m+1 as varchar)+’-15’) 另外,取得本月天数 select datediff(day,cast(month(GetDate()) as varchar)+’-’+cast(month(GetDate()) as varchar)+’-15’ ,cast(month(GetDate()) as varchar)+’-’+cast(month(GetDate())+1 as varchar)+’-15’) 或者使用计算本月的最后一天的脚本,然后用DAY函数区最后一天 SELECT Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))) 4)判断是否闰年: SELECT case day(dateadd(mm, 2, dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)))) when 28 then ’平年’ else ’闰年’ end 或者 select case datediff(day,datename(year,getdate())+’-02-01’,dateadd(mm,1,datename(year,getdate())+’-02-01’)) when 28 then ’平年’ else ’闰年’ end 5)一个季度多少天 declare @m tinyint,@time smalldatetime select @m=month(getdate()) select @m=case when @m between 1 and 3 then 1 when @m between 4 and 6 then 4 when @m between 7 and 9 then 7 else 10 end select @time=datename(year,getdate())+’-’+convert(varchar(10),@m)+’-01’ select datediff(day,@time,dateadd(mm,3,@time))
6)在两个日期范围里所跨越那几周返回如:1,2表是第一周和第二周,
declare @aa table (date datetime,weekdays int ) declare @i int set @i=datediff(day,@bdate,@edate) while(@i>=0) begin insert @aa values (dateadd(day,@i,@bdate),datepart(week,dateadd(day,@i,@bdate))) set @i=@i-1 end select weekdays into #week from @AA group by weekdays
7):在日期范围里减去周六、周日的天数 create function a (@Sdate datetime ,@Edate datetime) returns int as begin declare @aa table (date datetime) declare @i int set @i=datediff(day,@Sdate,@Edate) while(@i>=0) begin insert @aa values (dateadd(day,@i,@Sdate)) set @i=@i-1 end select @i= count(*) from @aa where datepart(weekday,date) not in (1,7) return @i end --如:select dbo.A('2004-10-01','2004-10-11') --返回结果为7
8);输入第几周得到此周的开始、结束日期 declare @FirstDayOfYear datetime--年頭 declare @FirstDayWeekOfYear datetime --第一周的第一天 declare @BDate datetime declare @EDate datetime
select @FirstDayOfYear= dateadd(yy,datediff(yy,0,getdate()),0) select @FirstDayWeekOfYear=@FirstDayOfYear - datepart(dw, @FirstDayOfYear)+1
select @EDate=dateadd(ww,@week,@FirstDayWeekOfYear-1 ) select @BDate= dateadd(ww,-1,dateadd(dd,1,@EDate) ) SET @BDate =convert(datetime, convert(char(10),@BDate,101)) SET @EDate =convert(datetime, convert(char(10),@EDate,101)) |