DATEADD的这三种用途有什么区别吗?

时间:2011-01-17 10:10:24

标签: sql sql-server-2005 tsql

以下所有三个陈述都会返回相同的结果。所以我很难看到使用dayofyear,day和weekday之间的区别。我错过了什么或者它们都相同吗?

   SELECT DATEADD(dayofyear,1,'20111231')
   SELECT DATEADD(day,1,'20111231')
   SELECT DATEADD(weekday,1,'20111231')

他们都返回2012-01-01 00:00:00.000

2 个答案:

答案 0 :(得分:6)

在那种用途中,没有他们返回相同的。虽然“日”对于这种用途感觉很自然。

区别在于(例如)DATEPART:

SELECT DATEPART(dayofyear,'20111231') -- 365
SELECT DATEPART(day,'20111231') -- 31
SELECT DATEPART(weekday,'20111231') --7

以下是MSDN ref

  

dayofyear,day和weekday return   相同的价值。

答案 1 :(得分:1)

SELECT DATEADD(dayofyear,1,'20111231')
SELECT DATEADD(day,1,'20111231')
SELECT DATEADD(weekday,1,'20111231')

它们都是等价的。

日期部分月,年,日,小时本身就是所有计量单位。但是,白天和工作日不是。但你可以这样看待它 -

the datepart "month" changes when the month changes,
the datepart "hour" changes when the hour changes,
the datepart "dayofyear" changes (by 1) when the day changes,
the datepart "weekday" changes (by 1) when the day changes
the datepart "day" changes (by 1) when the day changes

所以你必须争辩说“ dayofyear 的”单位等于一天。到日期添加“dayofyear”部分,它会将日期增加1天。

如果您从日期变量或日期/时间列开始,则可以只添加1,例如

dateadd(d, 1, @date)  ==  @date + 1

它不适用于日期文字

select '2010-12-12' + 1   -- attempts to add the string '2010-12-12' to 1

必须投射/转换

select cast('2010-12-12' as datetime) + 1

但是在那个阶段,你可以使用dateadd,它隐式地转换第三个参数

select dateadd(d, 1, '2010-12-12')  -- 2010-12-13
select dateadd(d, 1, 40522)         -- 2010-12-13