在尝试从 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。

原始日期时间偏移: 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

为什么会这样?

最佳答案

因为 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 )

关于sql-server - 带有 DateTimeoffset 的 DateAdd 有时会删除偏移量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37887818/

10-13 08:13