2017-10-16 78 views
2

我想通過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 
+0

如果你這麼做很多次,那麼'getdate()'和'getutcdate()'可能會關閉幾毫秒。 –

+0

真的很重要嗎?因爲,我只爲Minutes部分獲得了datediff。即使我做了幾次,理想情況下它應該給我相同的日期時間值。但是,如果我多次使用它,爲什麼它在毫秒數上有差異,您有任何參考嗎? – Bharathi

+3

它可能很重要,因爲'datediff()'測量時間之間的界限*。 –

回答

0

@GordonLinoff解釋爲什麼出現這種情況:由於職能在執行略不同的時間,他們可能會返回不同的分鐘。

要解決,試試這個:

DECLARE @DateTimeOffset_Value Datetimeoffset 
DECLARE @Datediff_Value INT, @DateInString VARCHAR(10) 
SET @DateInString = CONVERT(VARCHAR, GETDATE(), 112) 
SET @DateTimeOffset_Value = TODATETIMEOFFSET(@DateInString, DATENAME(tzoffset,SYSDATETIMEOFFSET())) 
SET @Datediff_Value = DATEDIFF(MI, @DateInString, @DateTimeOffset_Value) 
SELECT @DateInString, @DateTimeOffset_Value, @Datediff_Value 

它不使用當前的日期比較。

備註:在白天節電改變期間,您可能會得到與預期值不同的值,具體取決於代碼的運行時間。

有關如何處理DTS更改的更多解決方案,請參閱https://dba.stackexchange.com/questions/28187/how-can-i-get-the-correct-offset-between-utc-and-local-times-for-a-date-that-is

+0

我仍然試圖從MSDN中找到任何引用/鏈接,以便GetDate()和GetUTCD在單選時返回不同的日期時間。但是,這個答案解決了我將日期轉換爲datetimeoffset的問題。謝謝。 – Bharathi

+1

@Bharathi - 我找不到任何微軟引用,但有一些存在的問題處理相同的問題:https://stackoverflow.com/questions/6036223/will-getutcdate-return-the-same-value- if-used-in-the-same-statement/6036783#6036783和https://stackoverflow.com/questions/3620105/sql-server-intrigued-by-getdate/3620119#3620119 – Alex

0

兩個功能不會被同時執行。所以大概有一次100,000(在你的測試中)時間是在分鐘邊界的兩邊。

如果你只是想的時區,你可以嘗試:

選擇日期部分(TZ,SYSDATETIMEOFFSET())

相關問題