sql dateadd 获取新时间

主页技术资源库学习下载支持社区

登录 | 中国(简体中文) | 首选项

 

 

MSDN Library

 

SQL Server

 

SQL Server 2008 R2

MSDN

DATEADD (Transact-SQL)

SQL Server 2008 R2

其他版本

将指定 number 时间间隔(有符号整数)与指定 date 的指定 datepart 相加后,返回该 date

有关所有 Transact-SQL 日期和时间数据类型及函数的概述,请参阅日期和时间数据类型及函数 (Transact-SQL)。有关日期和时间数据类型及函数共有的信息和示例,请参阅使用日期和时间数据

主题链接图标 Transact-SQL 语法约定

语法


复制

DATEADD (datepart , number , date )

参数


datepart

是与 integer number 相加的 date 部分。下表列出了所有有效的 datepart 参数。用户定义的变量等效项是无效的。

datepart
缩写

year

yy, yyyy

quarter

qq, q

month

mm, m

dayofyear

dy, y

day

dd, d

week

wk, ww

weekday

dw, w

hour

hh

minute

mi, n

second

ss, s

millisecond

ms

microsecond

mcs

nanosecond

ns

number

是一个表达式,可以解析为与 datedatepart 相加的 int。用户定义的变量是有效的。

如果您指定一个带小数的值,则将小数截去且不进行舍入。

date

是一个表达式,可以解析为 timedatesmalldatetimedatetimedatetime2datetimeoffset 值。date 可以是表达式、列表达式、用户定义的变量或字符串文字。如果表达式是字符串文字,则它必须解析为一个 datetime值。为避免不确定性,请使用四位数年份。有关两位数年份的信息,请参阅 two digit year cutoff 选项

返回类型


返回数据类型为 date 参数的数据类型,字符串文字除外。

字符串文字的返回数据类型为 datetime。如果字符串文字的秒数小数位数超过三位 (.nnn) 或包含时区偏移量部分,将引发错误。

返回值


datepart 参数

dayofyeardayweekday 返回相同的值。

每个 datepart 及其缩写都返回相同的值。

如果 datepartmonthdate 月份比返回月份的天数多,因而 date 中的日在返回月份中不存在,则返回返回月份的最后一天。例如,9 月份有 30 天;因此,下面两个语句返回 2006-09-30 00:00:00.000:

SELECT DATEADD(month, 1, '2006-08-30')

SELECT DATEADD(month, 1, '2006-08-31')

number 参数

number 参数不能超出 int 的范围。在下面的语句中,number 的参数超出 int 范围 1。将返回如下错误消息:“将表达式转换为数据类型 int 时出现算术溢出错误。”

复制

SELECT DATEADD(year,2147483648, '2006-07-31');
SELECT DATEADD(year,-2147483649, '2006-07-31');
date 参数

date 参数不能增加至其数据范围之外的值。在下面的语句中,与 date 值相加的 number 值超出了 date 数据类型的范围。将返回如下错误消息:“将值添加到 'datetime' 列导致溢出。”

复制

SELECT DATEADD(year,2147483647, '2006-07-31');
SELECT DATEADD(year,-2147483647, '2006-07-31');
date 为 smalldatetime 型、datepart 为秒或秒小数部分时的返回值

smalldatetime 值的秒数部分始终为 00。如果 date 的数据类型为 smalldatetime,则适用以下准则:

  • 如果 datepartsecondnumber 介于 -30 和 +29 之间,则不执行加法。
  • 如果 datepartsecondnumber 小于 -30 或大于 +29,则以一分钟为起值执行加法。
  • 如果 datepartmillisecondnumber 介于 -30001 和 +29998 之间,则不执行加法。
  • 如果 datepartmillisecondnumber 小于 -30001 或大于 +29998,则以一分钟为起值执行加法。

注释


DATEADD 可用在 SELECT 、WHERE、HAVING、GROUP BY 和 ORDER BY 子句中。

秒的小数部分精度

不允许将日期部分 microsecondnanosecond 与数据类型为 smalldatetimedatedatetimedate 相加。

毫秒的小数位数为 3 (.123)。微秒的小数位数为 6 (.123456)。纳秒的小数位数为 9 (.123456789)。timedatetime2datetimeoffset 数据类型的最大小数位数为 7 (.1234567)。如果 datepartnanosecond,则 number 必须为 100 才能使 date 的秒小数部分增加。介于 1 和 49 之间的 number 向下舍入为 0,介于 50 和 99 之间的 number 向上舍入为 100。

以下语句加的 datepartmillisecondmicrosecondnanosecond

复制

DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111'
SELECT '1 millisecond' ,DATEADD(millisecond,1,@datetime2)
UNION ALL
SELECT '2 milliseconds', DATEADD(millisecond,2,@datetime2)
UNION ALL
SELECT '1 microsecond', DATEADD(microsecond,1,@datetime2)
UNION ALL
SELECT '2 microseconds', DATEADD(microsecond,2,@datetime2)
UNION ALL
SELECT '49 nanoseconds', DATEADD(nanosecond,49,@datetime2)
UNION ALL
SELECT '50 nanoseconds', DATEADD(nanosecond,50,@datetime2)
UNION ALL
SELECT '150 nanoseconds', DATEADD(nanosecond,150,@datetime2);
/*
Returns:
1 millisecond     2007-01-01 13:10:10.1121111
2 milliseconds    2007-01-01 13:10:10.1131111
1 microsecond     2007-01-01 13:10:10.1111121
2 microseconds    2007-01-01 13:10:10.1111131
49 nanoseconds    2007-01-01 13:10:10.1111111
50 nanoseconds    2007-01-01 13:10:10.1111112
150 nanoseconds   2007-01-01 13:10:10.1111113
*/
时区偏移量

不允许对时区偏移量执行加法。

示例


A. 以 1 为增量递增 datepart

下面的每条语句以 1 为增量递增 datepart

复制

DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111'
SELECT 'year', DATEADD(year,1,@datetime2)
UNION ALL
SELECT 'quarter',DATEADD(quarter,1,@datetime2)
UNION ALL
SELECT 'month',DATEADD(month,1,@datetime2)
UNION ALL
SELECT 'dayofyear',DATEADD(dayofyear,1,@datetime2)
UNION ALL
SELECT 'day',DATEADD(day,1,@datetime2)
UNION ALL
SELECT 'week',DATEADD(week,1,@datetime2)
UNION ALL
SELECT 'weekday',DATEADD(weekday,1,@datetime2)
UNION ALL
SELECT 'hour',DATEADD(hour,1,@datetime2)
UNION ALL
SELECT 'minute',DATEADD(minute,1,@datetime2)
UNION ALL
SELECT 'second',DATEADD(second,1,@datetime2)
UNION ALL
SELECT 'millisecond',DATEADD(millisecond,1,@datetime2)
UNION ALL
SELECT 'microsecond',DATEADD(microsecond,1,@datetime2)
UNION ALL
SELECT 'nanosecond',DATEADD(nanosecond,1,@datetime2);
/*
Year         2008-01-01 13:10:10.1111111
quarter      2007-04-01 13:10:10.1111111
month        2007-02-01 13:10:10.1111111
dayofyear    2007-01-02 13:10:10.1111111
day          2007-01-02 13:10:10.1111111
week         2007-01-08 13:10:10.1111111
weekday      2007-01-02 13:10:10.1111111
hour         2007-01-01 14:10:10.1111111
minute       2007-01-01 13:11:10.1111111
second       2007-01-01 13:10:11.1111111
millisecond  2007-01-01 13:10:10.1121111
microsecond  2007-01-01 13:10:10.1111121
nanosecond   2007-01-01 13:10:10.1111111
*/
B. 在一条语句中将 datepart 增加一级以上

下面的每条语句将 datepart 与一个足够大的 number 相加,使得 date 的上一级 datepart 也增大。

复制

DECLARE @datetime2 datetime2;
SET @datetime2 = '2007-01-01 01:01:01.1111111';
--Statement                                 Result   
------------------------------------------------------------------- 
SELECT DATEADD(quarter,4,@datetime2);     --2008-01-01 01:01:01.110
SELECT DATEADD(month,13,@datetime2);      --2008-02-01 01:01:01.110
SELECT DATEADD(dayofyear,365,@datetime2); --2008-01-01 01:01:01.110
SELECT DATEADD(day,365,@datetime2);       --2008-01-01 01:01:01.110
SELECT DATEADD(week,5,@datetime2);        --2007-02-05 01:01:01.110
SELECT DATEADD(weekday,31,@datetime2);    --2007-02-01 01:01:01.110
SELECT DATEADD(hour,23,@datetime2);       --2007-01-02 00:01:01.110
SELECT DATEADD(minute,59,@datetime2);     --2007-01-01 02:00:01.110
SELECT DATEADD(second,59,@datetime2);     --2007-01-01 01:02:00.110
SELECT DATEADD(millisecond,1,@datetime2); --2007-01-01 01:01:01.110
C. 使用表达式作为 number 和 date 形参的实参

以下示例使用不同类型的表达式作为 numberdate 形参的实参。

将列指定为 date

下例将每个 OrderDate 加上 2 天以计算新的 PromisedShipDate

复制

USE AdventureWorks2008R2;
GO
SELECT SalesOrderID
    ,OrderDate 
    ,DATEADD(day,2,OrderDate) AS PromisedShipDate
FROM Sales.SalesOrderHeader;
将用户定义的变量指定为 number 和 date

下例将用户定义的变量指定为 numberdate 的参数。

复制

DECLARE @days int;
DECLARE @datetime datetime;
SET @days = 365;
SET @datetime = '2000-01-01 01:01:01.111'; /* 2000 was a leap year */
SELECT DATEADD(day, @days, @datetime);
将标量系统函数指定为 date

下例指定 SYSDATETIME 用作 date

复制

SELECT DATEADD(month, 1, SYSDATETIME());
将标量子查询和标量函数指定为 number 和 date

下例将标量子查询和标量函数 MAX(ModifiedDate) 用作 numberdate 的参数。(SELECT TOP 1 BusinessEntityID FROM Person.Person) 是 number 形参的假实参,用来说明如何从值列表中选择 number 实参。

复制

USE AdventureWorks2008R2;
GO
SELECT DATEADD(month,(SELECT TOP 1 BusinessEntityID FROM Person.Person),
    (SELECT MAX(ModifiedDate) FROM Person.Person));
将常量指定为 number 和 date

下例将数值和字符常量用作 numberdate 的参数。

SELECT DATEADD(minute, 1, ' 2007-05-07 09:53:01.0376635');

将数值表达式和标量系统函数指定为 number 和 date

下例将数值表达式 (-(10/2))一元运算符 (-)、算术运算符 (/) 和标量系统函数 (SYSDATETIME) 用作 numberdate 的参数。

复制

SELECT DATEADD(month,-(10/2), SYSDATETIME());
将排名函数指定为 number

下例将排名函数用作 number 的参数。

复制

USE AdventureWorks2008R2;
GO
SELECT p.FirstName, p.LastName
    ,DATEADD(day,ROW_NUMBER() OVER (ORDER BY
        a.PostalCode),SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson AS s 
    INNER JOIN Person.Person AS p 
        ON s.BusinessEntityID = p.BusinessEntityID
    INNER JOIN Person.Address AS a 
        ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL 
    AND SalesYTD <> 0;
将聚合开窗函数指定为 number

下例将聚合开窗函数用作 number 的参数。

复制

USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, ProductID, OrderQty
    ,DATEADD(day,SUM(OrderQty) 
        OVER(PARTITION BY SalesOrderID),SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail 
WHERE SalesOrderID IN(43659,43664);
GO

请参阅


参考
CAST 和 CONVERT (Transact-SQL)
帮助和信息
获取 SQL Server 2008 R2 帮助

社区内容 添加

批注 常见问题

© 2010 Microsoft Corporation 版权所有。

保留所有权利 | 商标 | 隐私权声明 | 个人信息中心 | 法律信息 | MSDN Flash 中心 |联系我们 | 反馈信息 反馈信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值