我想通过ETL作业将字符串转换为DateTimeOffset
(在SQL Server中)。基本上,我的字符串看起来像'2017-10-15',我希望将其转换为DatetimeOffset
(来自当前的数据库服务器)。两个日期之间的SQL Server DateDiff返回不准确的值
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。我在我的存储过程中将它们作为单个select语句执行,并将其作为参数返回。
这很奇怪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。即使我做了几次,理想情况下它应该给我相同的日期时间值。但是,如果我多次使用它,为什么它在毫秒数上有差异,您有任何参考吗? – Bharathi
它可能很重要,因为'datediff()'测量时间之间的界限*。 –