SQL SERVER函数大全 下载本文

数据类型 time date 12:35:29. 1234567 2007-05-08 输出 smalldatetime 2007-05-08 12:35:00 datetime datetime2 2007-05-08 12:35:29.123 2007-05-08 12:35:29. 1234567 datetimeoffset 2007-05-08 12:35:29.1234567 +12:15

DATEADD()函数

DATEADD()函数用于在日期/时间值上加上日期单位间隔。比如,要得到2007年4月29日起90天后的日期,可以使用下列语句:

SELECT DATEADD(DAY, 90, '4-29-2007') 结果:2007-07-28 00:00:00.000

可以把下表的值作为时间间隔参数传递给DATEADD()函数。

datepart year quarter month dayofyear day week weekday hour yy, yyyy qq, q mm, m dy, y dd, d wk, ww dw, w hh 缩写 minute second millisecond microsecond nanosecond

mi, n ss, s ms mcs ns 在下面列出的例子中,我们使用和上一个例子一样的日期,并且在这些例子中还包含了时间数据。每个操作的结果将显示在查询的下一行中。

18年后:

SELECT DATEADD(YEAR, 18, '4-29-1988 10:30 AM') 2006-04-29 10:30:00.000 18年前:

SELECT DATEADD(YY, -18, '4-29-1988 10:30 AM') 1970-04-29 10:30:00.000 9000秒后:

SELECT DATEADD(SECOND, 9000, '4-29-1988 10:30 AM') 1988-04-29 13:00:00.000 9000000毫秒前:

SELECT DATEADD(MS, -9000000, '4-29-1988 10:30 AM') 1988-04-29 08:00:00.000

可以将CONVERT()函数和DATEADD()函数组合在一起,来对1989年9月8日9个月前的日期值进行格式化。

SELECT CONVERT(varchar(20), DATEADD(M, -9, '9-8-1989'), 101) 12/08/1988

这将返回一个可变长度的字符值,比前面例子结果中的默认日期更易容易理解。这是一个函数嵌套调用,DATEADD()函数的返回值(一个DateTime类型的值)被作为值参数传递给CONVERT()函数。 DATEDIFF()函数

DATEADD()和DATEDIFF()函数可以看作一对表兄弟,有点像乘法与除法。在等式的两端有4个元素:起始日期、时间间隔(datepart)、差值和最终日期。如果已知其中的三个值,

就可以求出第4个值。如果在DATEADD()函数中使用起始日期、一个整型值和一个时间间隔,就可返回与起始日期相关的最终日期值。如果提供了起始日期、时间间隔和最终日期,DATEDIFF()函数就可以返回差值。

为了说明这一点,我们选择任意两个日期与一个时间间隔作为参数。这个函数将以所提供的时间间隔为单位返回两个日期之间的差值。要知道1989年9月8日和1991年10月17日之间差了几个月,可编写如下查询代码:

SELECT DATEDIFF(MONTH, '9-8-1989', '10-17-1991') 结果是25个月。如果以日期为单位呢?

SELECT DATEDIFF(DAY, '9-8-1989', '10-17-1991') 结果是769天。

1996年7月2日和1997年8月4日之间差几个星期? SELECT DATEDIFF(WEEK, '7-2-1996', '8-4-1997') 57星期。甚至可以算出自己的年龄是多少秒: DECLARE @MyBirthDate datetime SET @MyBirthDate = '7-16-1962' SELECT DATEDIFF(SS, @MyBirthDate, GETDATE())

结果显示有些人已经活了15亿秒了!

可以将列名作为参数,把这个函数用在查询中。首先建立一个简单的表,其中包含一些人的姓名和生日: SELECT c.FirstName ,c.LastName ,e.BirthDate ,DATEDIFF(YEAR, e.BirthDate, GETDATE()) AS ApproximateAge FROM HumanResources.Employee as e inner join Person.Contact as c on e.ContactID = c.ContactID order by c.LastName

下图显示了结果:

初看起来结果是对的,但存在的问题是年龄值没有精确到日。比如,根据表中的数据,Nancy的生日是12月21日,他今年将庆祝第32个生日(这个查询在2010年8月运行)。如果依据上述计算结果来确定他的年龄何时变化,就应在一月份的某天给他发生日卡片,这比实际日期提前了11个月。

除非用更小的时间单位来计算这些日期的差,否则结果只在雇员实际生日的一年以内是精确的。以下例子将用差值除以一年(包括闰年)的天数,并将结果值转换为int类型,进行取整运算,而不是四舍五入。 SELECT c.FirstName ,c.LastName ,e.BirthDate ,DATEDIFF(YEAR, e.BirthDate, GETDATE()) AS ApproximateAge ,CONVERT(int, DATEDIFF(DAY, e.BirthDate, GETDATE())/365) AS Age FROM HumanResources.Employee as e inner join Person.Contact as c on e.ContactID = c.ContactID order by c.LastName

比较这次的结果和上一个例子的结果,看看有什么不同。

可以看到,Nancy是31岁,其他雇员的年龄也精确到了天。表中的BirthDate列存储雇员的生日,并以午夜(00:00:00AM)为界,这是一天中的第一秒。GETDATE()函数返回当前的时间与日期。当前两个日期相差约8小时(写这段文字时是上午8点)。如果希望这个计算更精确,就需要在当前日期的午夜把GETDATE()函数的结果转换为datetime类型。