SQL Server日期计算[MSSQL防范]
本文“SQL Server日期计算[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
??? 普通,你需求获得当前日期和计算一些其他的日期,比方,你的程序大概需求判断一个月的第一天大概最后一天.你们大部份人大约都知道怎样把日期举行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算出自己所需求的日期!在这篇文章里,我将奉告你若何利用DATEADD和DATEDIFF函数来计算出在你的程序中大概你要用到的一些差别日期.?
??? 在利用本文中的例子之前,你必须注意以下的问题.大部份大概不是全部例子在差别的机械上履行的后果大概不一样,这完好由哪一天是一个星期的第一天这个设置决意.第一天(DATEFIRST)设定决意了你的系统利用哪一天作为一周的第一天.全部以下的例子都是以星期天作为一周的第一天来成立,也就是第一天设置为7.假定你的第一天设置不一样,你大概需求调整这些例子,使它和差别的第一天设置相符合.你可以通过@@DATEFIRST函数来查抄第一天设置.?
?
??? 为了理解这些例子,我们先复习一下DATEDIFF和DATEADD函数.DATEDIFF函数计算两个日期之间的小时、天、周、月、年等时间隔断总数.DATEADD函数计算一个日期通过给时间隔断加减来得到一个新的日期.要理解更多的DATEDIFF和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函数,大概减去时间隔断而不是增添,那么通过这些小的调整你可以发现和多差别的日期.?
?
???? 这里有四个例子利用别的一个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?
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))
以上是“SQL Server日期计算[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |