簡體   English   中英

UTC時區計算

[英]UTC time zone calculation

我們將時區(“澳大利亞東部標准時間”)中的數據存儲到 SQL Server 數據庫中,我們必須進行計算。 是否可以將兩個日期都轉換為 UTC 進行計算,以便計算出正確的差異?

DECLARE @startdate DateTime = '2022-10-01 23:13:00.000'; --UTC 2022-10-01 13:13:00.00
DECLARE @enddate DateTime = '2022-10-02 12:08:00.000' --UTC 2022-10-02 01:08:00.00
select CAST((@enddate - @startdate) as time(0)) 'Difference'

Time difference: 12:55:00

Actual Time Difference: 11:55:00

正如@Larnu 在評論中建議的那樣,如果沒有偏移量,日期時間值將會出現問題。 當時鍾撥回並導致時間更改前后的重疊時間時,就會發生這種情況。 在這種情況下,您需要規則來確定偏移量。

在您的示例中,時鍾向前設置,不應有重疊或歧義。 這允許使用AT DATE TIME AUS Eastern Standard Time')將日期時間值轉換為 datetimeoffset 以進行持續時間計算。 如果存儲了無效的日期時間值(在時鍾應該向前更改的間隙內), AT DATE TIME將返回時鍾更改后的偏移量。

DECLARE @startdate DateTime = '2022-10-01 23:13:00.000'; --UTC 2022-10-01 13:13:00.00
DECLARE @enddate DateTime   = '2022-10-02 12:08:00.000';  --UTC 2022-10-02 01:08:00.00
SELECT DATEADD(second
        , DATEDIFF(second, @startdate AT TIME ZONE 'AUS Eastern Standard Time'
        , @enddate AT TIME ZONE 'AUS Eastern Standard Time')
    , CAST('00:00:00' AS time(0)));

因此,您一年中將有一個小時需要為其制定業務規則。 當時鍾向后設置時, AT DATE TIME將在不明確的時間間隔內返回更改前的偏移量。

不推薦使用 DATETIME,因為它是一種具有大量錯誤特征的數據類型,而且不准確。

使用 DATETIME2 instaed(MS 推薦)

然后用操作符 AT TIME ZONE 設置 TIMEZONE:

使用 ALSO DATETDIFF 來獲得差異,因為減號必須僅適用於不適用於日期/時間演算的數字......

最后:

DECLARE @startdate DateTime2 = '2022-10-01 23:13:00.000'; 
DECLARE @enddate DateTime2 = '2022-10-02 12:08:00.000'; 
DECLARE @difsecond INT = DATEDIFF(s, @startdate AT TIME ZONE 'AUS Eastern Standard Time', @enddate AT TIME ZONE 'AUS Eastern Standard Time')  
SELECT CAST(DATEADD(s, @difsecond, CAST('2000-01-01' AS DATETIME2(0))) AS TIME)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM