我有一個DB,它將日期存儲爲帶有UTC偏移的日期時間。 如何將這些日期從UTC轉換爲選擇語句中的CET?T-SQL:將日期時間字段的值從UTC轉換爲CET時區
是否有某種語法糖照顧全天候秋/冬季和春季/夏季抵消的東西?
編輯: 我發現this庫在CodePlex上有用:
DateTimeUtil
一組UDF和配置數據的擴展日期時間處理,電子商務。 G。它提供了簡單的時區轉換,使用本機T-SQL(無CLR)支持夏令時。
我有一個DB,它將日期存儲爲帶有UTC偏移的日期時間。 如何將這些日期從UTC轉換爲選擇語句中的CET?T-SQL:將日期時間字段的值從UTC轉換爲CET時區
是否有某種語法糖照顧全天候秋/冬季和春季/夏季抵消的東西?
編輯: 我發現this庫在CodePlex上有用:
DateTimeUtil
一組UDF和配置數據的擴展日期時間處理,電子商務。 G。它提供了簡單的時區轉換,使用本機T-SQL(無CLR)支持夏令時。
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
可能是我錯過了一些東西,但是你如何計算夏季和冬季一小時的時間。 – 2014-09-29 15:30:07
@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
您可以在此驗證http://www.worldtimebuddy.com/ – mhn 2014-09-29 16:26:14
這是完美的,如果你的數據庫包含UTC日期。更好的方法是使用您的操作系統時區偏移量。
例如:
select
dateadd(minute,DATEPART(TZ, SYSDATETIMEOFFSET()), YourUTCDate) as timestamp
from YourTable
試試這個 - 從YourTable'SELECT DATEADD(SECOND,DATEDIFF(SECOND,GETUTCDATE(),GETDATE()),ColumnWithUTCDate)作爲CETCol;' – 2014-09-29 13:42:56
只是出於好奇您使用。淨?如果是,那麼你將更容易處理Offset/timezone – 2014-09-29 13:59:08
#Kirshnraj Rana +1,這很聰明。不幸的是,有時候我需要在不同時區的時間。 #ShekharPankaj - 不,只是來自ssms的查詢。 – 2014-09-29 15:26:58