2014-09-29 151 views
0

我有一個DB,它將日期存儲爲帶有UTC偏移的日期時間。 如何將這些日期從UTC轉換爲選擇語句中的CET?T-SQL:將日期時間字段的值從UTC轉換爲CET時區

是否有某種語法糖照顧全天候秋/冬季和春季/夏季抵消的東西?

編輯: 我發現this庫在CodePlex上有用:

DateTimeUtil

一組UDF和配置數據的擴展日期時間處理,電子商務。 G。它提供了簡單的時區轉換,使用本機T-SQL(無CLR)支持夏令時。

+1

試試這個 - 從YourTable'SELECT DATEADD(SECOND,DATEDIFF(SECOND,GETUTCDATE(),GETDATE()),ColumnWithUTCDate)作爲CETCol;' – 2014-09-29 13:42:56

+0

只是出於好奇您使用。淨?如果是,那麼你將更容易處理Offset/timezone – 2014-09-29 13:59:08

+0

#Kirshnraj Rana +1,這很聰明。不幸的是,有時候我需要在不同時區的時間。 #ShekharPankaj - 不,只是來自ssms的查詢。 – 2014-09-29 15:26:58

回答

1
SELECT CONVERT(VARCHAR, dbo.udfToLocalTime(t.CreatedDateTime, '1'), 113) 
FROM yourtable t 

在更新的情況下:

UPDATE yourtable t 
SET t.CreatedDateTime = CONVERT(VARCHAR, dbo.udfToLocalTime(t.CreatedDateTime, '1'), 113) 

使用UDF如下

CREATE FUNCTION udfToLocalTime 
(
    @UtcDateTimeAS DATETIME 
    ,@UtcOffset AS INT = -8 --PST 
) 
RETURNS DATETIME 
AS 
BEGIN 

    DECLARE @PstDateTimeAS DATETIME 
      ,@Year AS CHAR(4) 
      ,@DstStart AS DATETIME 
      ,@DstEndAS DATETIME 
      ,@Mar1 AS DATETIME 
      ,@Nov1 AS DATETIME 
      ,@MarTime AS TIME 
      ,@NovTime AS TIME 
      ,@Mar1Day AS INT 
      ,@Nov1Day AS INT 
      ,@MarDiff AS INT 
      ,@NovDiff AS INT 

    SELECT @Year = YEAR(@UtcDateTime) 
      ,@MarTime = CONVERT(TIME, DATEADD(HOUR, [email protected], '1900-01-01 02:00')) 
      ,@NovTime = CONVERT(TIME, DATEADD(HOUR, [email protected] - 1, '1900-01-01 02:00')) 
      ,@Mar1 = CONVERT(CHAR(16), @Year + '-03-01 ' + CONVERT(CHAR(5), @MarTime), 126) 
      ,@Nov1 = CONVERT(CHAR(16), @Year + '-11-01 ' + CONVERT(CHAR(5), @NovTime), 126) 
      ,@Mar1Day = DATEPART(WEEKDAY, @Mar1) 
      ,@Nov1Day = DATEPART(WEEKDAY, @Nov1) 

    --Get number of days between Mar 1 and DST start date 
    IF @Mar1Day = 1 
    SET @MarDiff = 7 
    ELSE 
    SET @MarDiff = 15 - @Mar1Day 

    --Get number of days between Nov 1 and DST end date 
    IF @Nov1Day = 1 
    SET @NovDiff = 0 
    ELSE 
    SET @NovDiff = 8 - @Nov1Day 

    --Get DST start and end dates 
    SELECT @DstStart = DATEADD(DAY, @MarDiff, @Mar1) 
      ,@DstEnd= DATEADD(DAY, @NovDiff, @Nov1) 

    --Change UTC offset if @UtcDateTime is in DST Range 
    IF @UtcDateTime >= @DstStart AND @UtcDateTime < @DstEnd 
    SET @UtcOffset = @UtcOffset + 1 

    --Get Conversion 
    SET @PstDateTime = DATEADD(HOUR, @UtcOffset, @UtcDateTime) 
    RETURN @PstDateTime 
END 
+0

可能是我錯過了一些東西,但是你如何計算夏季和冬季一小時的時間。 – 2014-09-29 15:30:07

+0

@VelislavMarinov。修改瞭解決方案以照顧夏令時。已測試SELECT轉換(VARCHAR,dbo.udfToLocalTime('2014-02-15 00:00:00.000','1'),113) SELECT convert(VARCHAR,dbo.udfToLocalTime('2014-04-15 00:00 (VARCHAR,dbo.udfToLocalTime('2014-09-15 00:00:00.000','1'),113) SELECT convert(VARCHAR,dbo.udfToLocalTime ('2014-11-15 00:00:00.000','1'),113) – mhn 2014-09-29 16:25:54

+0

您可以在此驗證http://www.worldtimebuddy.com/ – mhn 2014-09-29 16:26:14

0

這是完美的,如果你的數據庫包含UTC日期。更好的方法是使用您的操作系統時區偏移量。

例如:

select 
    dateadd(minute,DATEPART(TZ, SYSDATETIMEOFFSET()), YourUTCDate) as timestamp 
from YourTable 
相關問題