【发布时间】:2017-10-16 01:18:10
【问题描述】:
我正在尝试通过 ETL 作业将字符串转换为 DateTimeOffset(在 SQL Server 中)。基本上,我的字符串看起来像'2017-10-15',我希望将其转换为DatetimeOffset(来自当前的数据库服务器)。
SELECT
SWITCHOFFSET(DATEADD(mi, DATEDIFF(MI, GETDATE(), GETUTCDATE()), CAST(@DateInString + ' 00:00:00' AS DATETIMEOFFSET)), DATENAME(tzoffset, SYSDATETIMEOFFSET()))
我在这个语句中遇到了一些奇怪的问题,因为最终输出会比预期的下降 +1 / -1 分钟。至少每 10 条记录/百万会发生这种情况。我试图确定问题,我可以看到问题在于 DATEDIFF() 方法返回 +/-1 分钟。
SELECT DATEDIFF(MI, GETDATE(), GETUTCDATE())
这应该完全返回 -600(因为我的数据库服务器 UTC 是 +10)。但是,对于少数记录,它会返回 -599 或 601。我在存储过程中将它们作为单个选择语句执行,并将其作为参数返回。
这很奇怪 SQL 如何在同一个 select 语句中检测到 GETDATE() 和 GETUTCDATE() 的两个不同的日期时间值。
有没有办法强制 SQL 在那些 DATEDIFF 参数中获得完全相同的日期,或者我在这里遗漏了什么?提前致谢
我使用的是 SQL Server 2014 (v12.0)。
存储过程:
CREATE PROCEDURE dbo.SPConvertDateTimeOffset
@DateInString VARCHAR(10),
@DateTimeOffset_Value DATETIMEOFFSET OUTPUT,
@Datediff_Value INT OUTPUT
AS
BEGIN
-- This line returns +/- 1
SELECT @Datediff_Value = DATEDIFF(MI, GETDATE(), GETUTCDATE())
SELECT @DateTimeOffset_Value = SWITCHOFFSET(DATEADD(mi, @Datediff_Value, CAST(@DateInString + ' 00:00:00' AS DATETIMEOFFSET)), DATENAME(tzoffset, SYSDATETIMEOFFSET()))
END
【问题讨论】:
-
如果您多次这样做,
getdate()和getutcdate()可能会延迟几毫秒。 -
真的很重要吗?因为,我只得到了 Minutes 部分的 datediff。即使我做了几次,理想情况下它应该让我得到相同的日期时间值。但是,如果我多次执行它,为什么它会以毫秒为单位有差异,您有什么参考吗?
-
这很重要,因为
datediff()在时间之间测量边界。
标签: sql sql-server tsql sql-server-2014 rdbms