使用DateTimeoffset的DateAdd有时会删除偏移量

时间:2016-06-17 18:10:46

标签: sql-server sql-server-2008 sql-server-2008-r2 datetimeoffset

为了从DateTimeOffsetValue中删除时间,我可以解决时区被删除的情况 - 我猜测这里发生了DateTime的隐式转换,但为什么呢?

DECLARE @d DATETIMEOFFSET = '2013-11-22 00:00:00.000 -07:00';

select
    [Original DateTimeOffset] = @d,
    [Add 1 Month] = DATEADD(MONTH,1,@d),
    [DateAdd and DateDiff] = DATEADD(dd, DATEDIFF(dd, 0, @d), 0);

上述查询导致DateAdd和DateDiff值以DateTime形式出现。我原以为它会是DateTimeOffset,因为输入日期是DateTimeOffset。

Original DateTimeOffset: 2013-11-22 00:00:00.0000000 -07:00
添加1个月: 2013-12-22 00:00:00.0000000 -07:00
DateAdd和DateDiff: 2013-11-22 00:00:00.000

为什么会这样?

1 个答案:

答案 0 :(得分:3)

因为int无法投放到datetimeoffset。归结为:

[DateAdd and DateDiff] = 0 + 41598 days

你如何解释0?它无法直接转换为datetimeoffset

SELECT CAST(0 as datetimeoffset) -- Error
SELECT CAST(CAST(0 as datetime) as datetimeoffset) -- OK

因此SQL Server隐式将其强制转换为datetime(即1990-01-01 00:00:00