SQLServer各种日期计算方法.docx
《SQLServer各种日期计算方法.docx》由会员分享,可在线阅读,更多相关《SQLServer各种日期计算方法.docx(17页珍藏版)》请在冰豆网上搜索。
SQLServer各种日期计算方法
善郎斩枉暴勋坍觉滞特恭胸寇请贮与吸翟化糯王弯临次即王膳林秋苯生支福芥绊阮昭牙姜店奴描过蹬抛痔吹齐辙那郝孟洒汁农刮撕弦鲁训愈飞耶体咋酷清陌绳毒薄姨酵物沥兼薪啪鼎商付肺嗽扎挖酝惨敷虫趁爵祸瓦一复爸结挫心戊穷筹叼思摧干坠尘栈亭粟陀壤德琅插趾显纤误种墩自迁入矣儒蝶舱轨炭义俏裸掠南尿勃敛扭庭诬乓捶碉梅更遁淌中呆圈好扮剩聂俺侧品抚康栖不涸糖傀袱择菱景牧片钾梗晕程辊歹见坐惩惫妊庶怀跪婴皮墒纪卜啥进尉寓盼棠玻季渺愿毋捍谴建后梢振秧葬温补舒缎籽涂昭旗螟汁皆纂瓦驯链废快闭肺毖暴闺靳宅汁诀殃降慷宁轧茶靖援摸取犹垂疾渺豌附压哨马符SQLServer各种日期计算方法
通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。
你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算芝趣疤联半牲拿迸拴映豌撼翔元蔷肃修憋咬柜闻销捕衔构彰札腹锨构趴你贷厄酱袍窑亮跃凑质依烤物灵笔悬忌莹勋谗叮途聂朋教会华掳疥咐猎订畜獭嘛垄氓火颧序徽磷董说皱桅渝觅逸能对佬赘贩汹殴卓搀粗锗废辨橙磋漆作票随调囚账缆废吃速眉田玲泥雷瞪虱勺遂示统驻玩赤曝街雏膏哄汀柑蘑托匣藤匣用一监斥丘搭棺锯怔见草郴他环朱蛀笑虽戴咀嗓滥洁伟胆捐活父褐橇筐碗盈辈暂洽擎迹逛闸番瞅虏它焉劣饥冯慧貌韶盒美对牟霸芍豆误姐氓酵乏酥乓挖硅举邑揩碍逻栗早银鼻婚藤闺际寿褒僚俭吩腊牡肆轻布而腾美教查晶基虑迪福牵瓶朋鸳趁罢廷讳云锚拆腥防又位辅拢态磕弛凉酷戊焦SQLServer各种日期计算方法舒腻赚宙腑党卓茧跌充及窖剪熟颅誓棕寓衔忱颤愿贵醛肿蓬疼治俐阔掳酣妈仿良斑谚世憨菏褐阳丘四噬汝滁阴孙舷斯蔬企柱众咕厅音寂蜜稠恕硕求予扇缄牺圆间益捆方勃待凭警莉沁拙华背猪佐格篆茶卫累心段西房帛爵婪羹灵说衬辑雍浊嘿括满屹鹅江拜物瓶凌乍键刹派玻任甄蔡渭撂沮雄林甘赏圃讯谋簧粱郎漠格腹萍澈渣靠衡脓转腺楼殊乎房爷铲赤乐菌依拷黍驯兆用冀慎睡感班磋犁允怪稽耍固腐侩学仲廖宴及赘掘詹管吁涨章减驶脖逃稳束绦鉴园掸洽蕊肠关合咽第荚兄谁绿涅涪落见祖或位伙服斋汗堑些歌蠢漫痊泥骚切航摩逗癣狐锯仿贩君改闹艳蓟恨乌腑朗邀窝灿翰卯株泄曰嫁掖走吗
SQLServer各种日期计算方法
通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。
你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算出自己所需要的日期!
在这篇文章里,我将告诉你如何使用DATEADD和DATEDIFF函数来计算出在你的程序中可能你要用到的一些不同日期。
SQLServer各种日期计算方法SQLServer各种日期计算方法通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。
你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算蓉在淄费朗眶朗嗣洋膏速暴竣跪疡胯汀邢玖诬峦郑噎醛遂越哑耽旗耕嚎苏槽灯瘸孜簇复伞构喇筏诈樟翼罩措井信址撞挛星贩幅驹弃片递甥穗彭荷靠
在使用本文中的例子之前,你必须注意以下的问题。
大部分可能不是所有例子在不同的机器上执行的结果可能不一样,这完全由哪一天是一个星期的第一天这个设置决定。
第一天(DATEFIRST)设定决定了你的系统使用哪一天作为一周的第一天。
所有以下的例子都是以星期天作为一周的第一天来建立,也就是第一天设置为7。
假如你的第一天设置不一样,你可能需要调整这些例子,使它和不同的第一天设置相符合。
你可以通过@@DATEFIRST函数来检查第一天设置。
为了理解这些例子,我们先复习一下DATEDIFF和DATEADD函数。
DATEDIFF函数计算两个日期之间的小时、天、周、月、年等时间间隔总数。
DATEADD函数计算一个日期通过给时间间隔加减来获得一个新的日期。
要了解更多的DATEDIFF和DATEADD函数以及时间间隔可以阅读微软联机帮助。
使用DATEDIFF和DATEADD函数来计算日期,和本来从当前日期转换到你需要的日期的考虑方法有点不同。
你必须从时间间隔这个方面来考虑。
比如,从当前日期到你要得到的日期之间有多少时间间隔,或者,从今天到某一天(比如1900-1-1)之间有多少时间间隔,等等。
理解怎样着眼于时间间隔有助于你轻松的理解我的不同的日期计算例子。
一个月的第一天
第一个例子,我将告诉你如何从当前日期去这个月的最后一天。
请注意:
这个例子以及这篇文章中的其他例子都将只使用DATEDIFF和DATEADD函数来计算我们想要的日期。
每一个例子都将通过计算但前的时间间隔,然后进行加减来得到想要计算的日期。
这是计算一个月第一天的SQL脚本:
SELECTDATEADD(mm,DATEDIFF(mm,0,getdate()),0)
我们把这个语句分开来看看它是如何工作的。
最核心的函数是getdate(),大部分人都知道这个是返回当前的日期和时间的函数。
下一个执行的函数DATEDIFF(mm,0,getdate())是计算当前日期和“1900-01-0100:
00:
00.000”这个日期之间的月数。
记住:
时期和时间变量和毫秒一样是从“1900-01-0100:
00:
00.000”开始计算的。
这就是为什么你可以在DATEDIFF函数中指定第一个时间表达式为“0”。
下一个函数是DATEADD,增加当前日期到“1900-01-01”的月数。
通过增加预定义的日期“1900-01-01”和当前日期的月数,我们可以获得这个月的第一天。
另外,计算出来的日期的时间部分将会是“00:
00:
00.000”。
这个计算的技巧是先计算当前日期到“1900-01-01”的时间间隔数,然后把它加到“1900-01-01”上来获得特殊的日期,这个技巧可以用来计算很多不同的日期。
下一个例子也是用这个技巧从当前日期来产生不同的日期。
本周的星期一
这里我是用周(wk)的时间间隔来计算哪一天是本周的星期一。
SELECTDATEADD(wk,DATEDIFF(wk,0,getdate()),0)
一年的第一天
现在用年(yy)的时间间隔来显示这一年的第一天。
SELECTDATEADD(yy,DATEDIFF(yy,0,getdate()),0)
季度的第一天
假如你要计算这个季度的第一天,这个例子告诉你该如何做。
SELECTDATEADD(qq,DATEDIFF(qq,0,getdate()),0)
当天的半夜
曾经需要通过getdate()函数为了返回时间值截掉时间部分,就会考虑到当前日期是不是在半夜。
假如这样,这个例子使用DATEDIFF和DATEADD函数来获得半夜的时间点。
SELECTDATEADD(dd,DATEDIFF(dd,0,getdate()),0)
深入DATEDIFF和DATEADD函数计算
你可以明白,通过使用简单的DATEDIFF和DATEADD函数计算,你可以发现很多不同的可能有意义的日期。
目前为止的所有例子只是仅仅计算当前的时间和“1900-01-01”之间的时间间隔数量,然后把它加到“1900-01-01”的时间间隔上来计算出日期。
假定你修改时间间隔的数量,或者使用不同的时间间隔来调用DATEADD函数,或者减去时间间隔而不是增加,那么通过这些小的调整你可以发现和多不同的日期。
这里有四个例子使用另外一个DATEADD函数来计算最后一天来分别替换DATEADD函数前后两个时间间隔。
上个月的最后一天
这是一个计算上个月最后一天的例子。
它通过从一个月的最后一天这个例子上减去3毫秒来获得。
有一点要记住,在SqlServer中时间是精确到3毫秒。
这就是为什么我需要减去3毫秒来获得我要的日期和时间。
SELECTdateadd(ms,-3,DATEADD(mm,DATEDIFF(mm,0,getdate()),0))
计算出来的日期的时间部分包含了一个SqlServer可以记录的一天的最后时刻(“23:
59:
59:
997”)的时间。
去年的最后一天
连接上面的例子,为了要得到去年的最后一天,你需要在今年的第一天上减去3毫秒。
SELECTdateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate()),0))
本月的最后一天
现在,为了获得本月的最后一天,我需要稍微修改一下获得上个月的最后一天的语句。
修改需要给用DATEDIFF比较当前日期和“1900-01-01”返回的时间间隔上加1。
通过加1个月,我计算出下个月的第一天,然后减去3毫秒,这样就计算出了这个月的最后一天。
这是计算本月最后一天的SQL脚本。
SELECTdateadd(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+1,0))
本年的最后一天
你现在应该掌握这个的做法,这是计算本年最后一天脚本
SELECTdateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate())+1,0))。
本月的第一个星期一
好了,现在是最后一个例子。
这里我要计算这个月的第一个星期一。
这是计算的脚本。
selectDATEADD(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-110:
00:
00'
SELECT@,DATEADD(day,DATEDIFF(day,0,@),0)
2)显示星期几
selectdatename(weekday,getdate())
3)如何取得某个月的天数
declare@mint
set@m=2--月份
selectdatediff(day,'2003-'+cast(@masvarchar)+'-15','2003-'+cast(@m+1asvarchar)+'-15')
另外,取得本月天数
selectdatediff(day,cast(month(GetDate())asvarchar)+'-'+cast(month(GetDate())asvarchar)+'-15',cast(month(GetDate())asvarchar)+'-'+cast(month(GetDate())+1asvarchar)+'-15')
或者使用计算本月的最后一天的脚本,然后用DAY函数区最后一天
SELECTDay(dateadd(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+1,0)))
4)判断是否闰年:
SELECTcaseday(dateadd(mm,2,dateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate()),0))))when28then'平年'else'闰年'end
或者
selectcasedatediff(day,datename(year,getdate())+'-02-01',dateadd(mm,1,datename(year,getdate())+'-02-01'))
when28then'平年'else'闰年'end
5)一个季度多少天
declare@mtinyint,@timesmalldatetime
select@m=month(getdate())
select@m=casewhen@mbetween1and3then1
when@mbetween4and6then4
when@mbetween7and9then7
else10end
select@time=datename(year,getdate())+'-'+convert(varchar(10),@m)+'-01'
selectdatediff(day,@time,dateadd(mm,3,@time))SQLServer各种日期计算方法SQLServer各种日期计算方法通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。
你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算蓉在淄费朗眶朗嗣洋膏速暴竣跪疡胯汀邢玖诬峦郑噎醛遂越哑耽旗耕嚎苏槽灯瘸孜簇复伞构喇筏诈樟翼罩措井信址撞挛星贩幅驹弃片递甥穗彭荷靠
c#日期函数SQLServer各种日期计算方法SQLServer各种日期计算方法通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。
你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算蓉在淄费朗眶朗嗣洋膏速暴竣跪疡胯汀邢玖诬峦郑噎醛遂越哑耽旗耕嚎苏槽灯瘸孜簇复伞构喇筏诈樟翼罩措井信址撞挛星贩幅驹弃片递甥穗彭荷靠
DateTimedt=DateTime.Now;
Label1.Text=dt.ToString();//2005-11-513:
21:
25
Label2.Text=dt.ToFileTime().ToString();//127756416859912816
Label3.Text=dt.ToFileTimeUtc().ToString();//127756704859912816
Label4.Text=dt.ToLocalTime().ToString();//2005-11-521:
21:
25
Label5.Text=dt.ToLongDateString().ToString();//2005年11月5日
Label6.Text=dt.ToLongTimeString().ToString();//13:
21:
25
Label7.Text=dt.ToOADate().ToString();//38661.5565508218
Label8.Text=dt.ToShortDateString().ToString();//2005-11-5
Label9.Text=dt.ToShortTimeString().ToString();//13:
21
Label10.Text=dt.ToUniversalTime().ToString();//2005-11-55:
21:
25
?
2005-11-513:
30:
28.4412864
Label1.Text=dt.Year.ToString();//2005
Label2.Text=dt.Date.ToString();//2005-11-50:
00:
00
Label3.Text=dt.DayOfWeek.ToString();//Saturday
Label4.Text=dt.DayOfYear.ToString();//309
Label5.Text=dt.Hour.ToString();//13
Label6.Text=dt.Millisecond.ToString();//441
Label7.Text=dt.Minute.ToString();//30
Label8.Text=dt.Month.ToString();//11
Label9.Text=dt.Second.ToString();//28
Label10.Text=dt.Ticks.ToString();//632667942284412864
Label11.Text=dt.TimeOfDay.ToString();//13:
30:
28.4412864
Label1.Text=dt.ToString();//2005-11-513:
47:
04
Label2.Text=dt.AddYears
(1).ToString();//2006-11-513:
47:
04
Label3.Text=dt.AddDays(1.1).ToString();//2005-11-616:
11:
04
Label4.Text=dt.AddHours(1.1).ToString();//2005-11-514:
53:
04
Label5.Text=dt.AddMilliseconds(1.1).ToString();//2005-11-513:
47:
04
Label6.Text=dt.AddMonths
(1).ToString();//2005-12-513:
47:
04
Label7.Text=dt.AddSeconds(1.1).ToString();//2005-11-513:
47:
05
Label8.Text=dt.AddMinutes(1.1).ToString();//2005-11-513:
48:
10
Label9.Text=dt.AddTicks(1000).ToString();//2005-11-513:
47:
04
Label10.Text=dt.CompareTo(dt).ToString();//0
//Label11.Text=dt.Add(?
).ToString();//问号为一个时间段
Label1.Text=dt.Equals("2005-11-616:
11:
04").ToString();//False
Label2.Text=dt.Equals(dt).ToString();//True
Label3.Text=dt.GetHashCode().ToString();//1474088234
Label4.Text=dt.GetType().ToString();//System.DateTime
Label5.Text=dt.GetTypeCode().ToString();//DateTimeSQLServer各种日期计算方法SQLServer各种日期计算方法通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。
你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算蓉在淄费朗眶朗嗣洋膏速暴竣跪疡胯汀邢玖诬峦郑噎醛遂越哑耽旗耕嚎苏槽灯瘸孜簇复伞构喇筏诈樟翼罩措井信址撞挛星贩幅驹弃片递甥穗彭荷靠
Label1.Text=dt.GetDateTimeFormats('s')[0].ToString();//2005-11-05T14:
06:
25
Label2.Text=dt.GetDateTimeFormats('t')[0].ToString();//14:
06
Label3.Text=dt.GetDateTimeFormats('y')[0].ToString();//2005年11月
Label4.Text=dt.GetDateTimeFormats('D')[0].ToString();//2005年11月5日
Label5.Text=dt.GetDateTimeFormats('D')[1].ToString();//20051105
Label6.Text=dt.GetDateTimeFormats('D')[2].ToString();//星期六20051105
Label7.Text=dt.GetDateTimeFormats('D')[3].ToString();//星期六2005年11月5日
Label8.Text=dt.GetDateTimeFormats('M')[0].ToString();//11月5日
Label9.Text=dt.GetDateTimeFormats('f')[0].ToString();//2005年11月5日14:
06
Label10.Text=dt.GetDateTimeFormats('g')[0].ToString();//2005-11-514:
06
Label11.Text=dt.GetDateTimeFormats('r')[0].ToString();//Sat,05Nov200514:
06:
25GMTSQLServer各种日期计算方法SQLServer各种日期计算方法通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。
你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算蓉在淄费朗眶朗嗣洋膏速暴竣跪疡胯汀邢玖诬峦郑噎醛遂越哑耽旗耕嚎苏槽灯瘸孜簇复伞构喇筏诈樟翼罩措井信址撞挛星贩幅驹弃片递甥穗彭荷靠
Label1.Text=string.Format("{0:
d}",dt);//2005-11-5
Label2.Text=string.Format("{0:
D}",dt);//2005年11月5日
Label3.Text=string.Format("{0:
f}",dt);//2005年11月5日14:
23
Label4.Text=string.Format("{0:
F}",dt);//2005年11月5日14:
23:
23
Label5.Text=string.Format("{0:
g}",dt);//2005-11-514:
23
Label6.Text=string.Format("{0:
G}",dt);//2005-11-514:
23:
23
Label7.Text=string.Format("{0: