sqlserver:SQL Server各种日期计算思路方法(收藏)

通常你需要获得当前日期和计算些其他日期例如可能需要判断个月天或者最后你们大部分人大概都知道怎样把日期进行分割(年、月、日等)然后仅仅用分割出来年、月、日等放在几个中计算出自己所需要日期!在这篇文 章里我将告诉你如何使用DATEADD和DATEDIFF来计算出在你中可能你要用到些区别日期
  在使用本文中例子的前你必须注意以下问题大部分可能不是所有例子在区别机器上执行结果可能不这完全由哪天是个星期天这个设置决定天(DATEFIRST)设定决定了你系统使用哪天作为所有以下例 子都是以星期天作为天来建立也就是第天设置为7假如你天设置不你可能需要调整这些例子使它和区别天设置相符合你可以通过@@DATEFIRST来检查第天设置
  
  为了理解这些例子我们先复习下DATEDIFF和DATEADDDATEDIFF计算两个日期的间小时、天、周、月、年等时间间隔总数DATEADD计算个日期通过给时间间隔加减来获得个新日期要了解更多DATEDI FF和DATEADD以及时间间隔可以阅读微软联机帮助
  
  使用DATEDIFF和DATEADD来计算日期和本来从当前日期转换到你需要日期考虑思路方法有点区别你必须从时间间隔这个方面来考虑比如从当前日期到你要得到日期的间有多少时间间隔或者从今天到某天(比如1900-1-1)的间有多少时间间隔等等理解怎样着眼于时间间隔有助于你轻松理解我区别日期计算例子
  
  个月
  
  第个例子我将告诉你如何从当前日期去这个月最后请注意:这个例子以及这篇文章中其他例子都将只使用DATEDIFF和DATEADD来计算我们想要日期个例子都将通过计算但前时间间隔然后进行加减来得到想要计算日期
  
  这是计算个月第SQL 脚本:
  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”
  
  这个计算窍门技巧是先计算当前日期到“1900-01-01”时间间隔数然后把它加到“1900-01-01”上来获得特殊日期这个窍门技巧可以用来计算很多区别日期个例子也是用这个窍门技巧从当前日期来产生区别日期
本周星期
  
  这里我是用周(wk)时间间隔来计算哪天是本周星期   
  SELECT DATEADD(wk, DATEDIFF(wk,0,getdate), 0)
  
  
  
  现在用年(yy)时间间隔来显示这
  
  SELECT DATEADD(yy, DATEDIFF(yy,0,getdate), 0)
  
  季度
  
  假如你要计算这个季度这个例子告诉你该如何做
  
  SELECT DATEADD(qq, DATEDIFF(qq,0,getdate), 0)
  
  当天半夜
  
  曾经需要通过getdate为了返回时间值截掉时间部分就会考虑到当前日期是不是在半夜假如这样这个例子使用DATEDIFF和DATEADD来获得半夜时间点
  
  SELECT DATEADD(dd, DATEDIFF(dd,0,getdate), 0)
  
  深入DATEDIFF和DATEADD计算
  
  你可以明白通过使用简单DATEDIFF和DATEADD计算你可以发现很多区别可能有意义日期
  
  目前为止所有例子只是仅仅计算当前时间和“1900-01-01”的间时间间隔数量然后把它加到“1900-01-01”时间间隔上来计算出日期假定你修改时间间隔数量或者使用区别时间间隔来DATEADD或者减去时间间隔而不是增加那么通过这些小调整你可以发现和多区别日期
  
  这里有 4个例子使用另外个DATEADD来计算最后天来分别替换DATEADD前后两个时间间隔
上个月最后
  
  这是个计算上个月最后例子它通过从个月最后天这个例子上减去3毫秒来获得点要记住在Sql Server中时间是精确到3毫秒这就是为什么我需要减去3毫秒来获得我要日期和时间
  
  SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate), 0))
  
  计算出来日期时间部分包含了个Sql Server可以记录最后时刻(“23:59:59:997”)时间
  
  去年最后
  
  连接上面例子为了要得到去年最后你需要在今年天上减去3毫秒
  
  SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate), 0))
  
  本月最后
  
  现在为了获得本月最后我需要稍微修改下获得上个月最后语句修改需要给用DATEDIFF比较当前日期和“1900-01-01”返回时间间隔上加1通过加1个月我计算出下个月然后减去3毫秒这样就计算出了这个月最后这是计算本月最后SQL脚本
  
  SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate)+1, 0))
  
  本年最后天   
  你现在应该掌握这个做法这是计算本年最后天脚本
  
  SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate)+1, 0))
  
  本月个星期
  
  好了现在是最后个例子这里我要计算这个月个星期这是计算脚本
  
  select DATEADD(wk, DATEDIFF(wk,0,
  dateadd(dd,6-datepart(day,getdate),getdate)
  ), 0)
  
  在这个例子里我使用了“本周星期脚本并作了点点修改修改部分是把原来脚本中“getdate”部分替换成计算本月第6天在计算中用本月第6天来替换当前日期使得计算可以获得这个月个星期
  
  整理总结
  
  我希望这些例子可以在你用DATEADD和DATEDIFF计算日期时给你点启发通过使用这个计算日期时间间隔数学思路方法我发现为了显示两个日期的间间隔有用历法是有价值注意这只是计算出这些日期种思路方法要牢记还有很多思路方法 可以得到相同计算结果假如你有其他思路方法那很不错要是你没有我希望这些例子可以给你些启发当你要用DATEADD和DATEDIFF计算你可能要用到日期时
附录其他日期处理思路方法
  
  1)去掉时分秒
  declare @ datetime
   @ = getdate --'2003-7-1 10:00:00'
  SELECT @,DATEADD(day, DATEDIFF(day,0,@), 0)
  
  2)显示星期几
  select datename(weekday,getdate)
  
  3)如何取得某个月天数
  declare @m
   @m=2 --月份
  select datedf(day,'2003-'+cast(@m as varchar)+'-15' ,'2003-'+cast(@m+1 as varchar)+'-15')
  另外取得本月天数
  select datedf(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 day(dateadd(mm, 2, dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate), 0)))) when 28 then '平年' '闰年' end
  或者
  select datedf(day,datename(year,getdate)+'-02-01',dateadd(mm,1,datename(year,getdate)+'-02-01'))
  when 28 then '平年' '闰年' end
  
  5)个季度多少天
  declare @m tiny,@time smalldatetime
  select @m=month(getdate)
  select @m= when @m between 1 and 3 then 1
  when @m between 4 and 6 then 4
  when @m between 7 and 9 then 7
   10 end
  select @time=datename(year,getdate)+'-'+convert(varchar(10),@m)+'-01'
  select datedf(day,@time,dateadd(mm,3,@time))
Tags:  sqlserver2008 sqlserver2005 sqlserver2000 sqlserver

延伸阅读

最新评论

发表评论