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