SQL Server中的日期函数
DATEDIFF() 函数、GETDATE() 函数、DATEADD() 函数、DATEPART() 函数
其中参数简写的值 (参数英文写法和简写均可)(概括不全仅列举部分)
接下来用一道应用题分析各个函数的用法
已知有表Record记录某网吧上网开始时间和结束时间
1、DATEDIFF() 函数返回两个日期之间的时间
例句:
SELECT DATEDIFF(day,'2017-04-20','2017-04-25') AS DiffDate
得到结果 : 得到的结果为enddate-startdate 的值(25-20=5)
2、 GETDATE() 函数用于返回当前的时间和日期
SELECT DATEDIFF(day,'2017-04-20',GETDATE()) AS DiffDate
得到的结果同上,此时系统当前日期为2017-04-25
以下为 DATEDIFF( )函数 和 GETDATE( )函数相结合的情况:
--a1.查询卡号为0023_ABC 这个月的上机次数
select count(CardID) as 上机次数 from Record
where CardID = '0023_ABC' and DATEDIFF(mm,BeginTime,getdate()) = 0
--a2.查询卡号为0023_ABC 上个月的上机次数
select count(CardID) as 上机次数 from Record
where CardID = '0023_ABC' and DATEDIFF(mm,BeginTime,getdate()) = 1
--b1.上个月为止所有上机信息记录
select * from Record where DATEDIFF(m,BeginTime,GETDATE())<=1
--b2.这个月为止所有上机信息记录
select * from Record where DATEDIFF(m,BeginTime,GETDATE())<=0
--c1.两天内上机信息记录
select * from Record where DATEDIFF(dd,BeginTime,GETDATE())<=2
--c2.查询24小时之内上机的人员卡号和机器ID列表
select CardID,ComputerID from Record where datediff(hh,BeginTime,getdate())<=24
a1.图 : a2.图 :
b1.图 :基于2017-04-25的日期 <= 1 就是3月到4月中所用的信息记录。
b2.图 :<= 0 就是4月中所用的信息记录。
c2.图 :
3、 DATEADD( ) 函数在日期中添加或减去指定的时间间隔
number 是您希望添加的间隔数;对于未来的时间,此数是正数,对于过去的时间,此数是负数
例如可以使用 DateAdd( )从当天算起 30 天以后的日期或从现在算起 45 分钟以后的时间
--d1.我们希望向 BeginTime 添加 2 天 并重命名该列为 NewBeginTime
SELECT id,DATEADD(day,2,BeginTime) AS NewBeginTime FROM Record
可以看出在原有BeginTime列上“日”中各自增加了两天。
DateAdd 函数不会返回无效日期。
---如下示例将在id为6的 4月25日加上6天。即为 4月31日,然而4月只有30天
--d2.将在id为6的 4月25日 基础上加上6天
SELECT id,DATEADD(day,6,BeginTime) AS NewBeginTime FROM Record where id = 6
若是希望返回过去的时间,则讲number值设为负数。
--d3.如下示例将在id为6的 4月25日减去6天
SELECT id,DATEADD(day,-6,BeginTime) AS NewBeginTime FROM Record where id = 6
4、 DATEPART( ) 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等
--e1.将 EndTime 的分钟数单独抽取出来
SELECT id,DATEPART(mi,EndTime) AS NewEndTime from Record
因为 id=1 的 EndTime 值为2017-03-22 12:30:00,其它都为整点。故只有第一列返回值是30
--e2.分离出 EndTime 的 年、月、日、时、分、秒
SELECT DATEPART(yyyy,EndTime) AS EndYear,
DATEPART(mm,EndTime) AS EndMonth,
DATEPART(dd,EndTime) AS EndDay,
DATEPART(hh,EndTime) AS EndHour,
DATEPART(mi,EndTime) AS EndMinute,
DATEPART(ss,EndTime) AS EndSecond
FROM Record