在使用本文中例子的前你必须注意以下问题大部分可能不是所有例子在区别机器上执行结果可能不样这完全由哪天是个星期第天这个设置决定第天(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))
最新评论