我想通過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()'測量時間之間的界限*。 –