如果我在WHERE子句中使用DateTime来过滤DateTimeOffset字段的行,会发生什么?
SQL Server是否将DateTime字段转换为DateTimeOffset,偏移量为ZERO或......?
例如:
DECLARE @myTime As DateTime = GetDAte()
SELECT *
FROM foo
WHERE @myTime > dbo.foo.TimeStampOffset -- TimeStampOffset is a DateTimeOffset field in foo table
答案 0 :(得分:1)
将DATETIME
或DATETIME2
与DATETIMEOFFSET
值进行比较时,会发生隐式转化。
DATETIMEOFFSET - > DATETIME2 强>
date
和time
被复制到DATETIME2
值,time zone
被截断。当DATETIME2(n)
值的精度大于DATETIMEOFFSET (n)
值的精度时,小数秒被截断以适合。 (http://msdn.microsoft.com/en-us/library/bb630289.aspx)
DATETIMEOFFSET - > DATETIME 强>
复制日期和时间值,并截断时区。当datetimeoffset(n)值的小数精度大于三位数时,该值将被截断。 (http://msdn.microsoft.com/en-us/library/bb630289.aspx)
DATETIMEOFFSET - > DATETIME或DATETIME2
当DATETIME
或DATETIME2
值转换为DATETIMEOFFSET
时,原始值将被视为UTC
值,偏移量将为+00:00
。 (DATETIME
和DATETIME2
类型不存储时区的偏移量。)
会发生什么?
如果您的服务器的时区不是+00:00,那么比较可能会导致误报和否定 - >结果将不是理想的结果。
如果您想与当前时间进行比较,请将@myTime
的声明更改为DECLARE @myTime As DateTimeOffset = SysDateTimeOffset()