2011-07-06 24 views
1

我有每小时传入数据(跨越5年),并且在CST或EST中记录了时间戳。我想以UTC时间将它存储在我的数据库中。TimeZone使用TSQL进行转换

有没有办法让我使用TSQL从CST/CDT/CPT或EST/EDT/EPT转换为UTC?

回答

1

可以确定为datetime在行EST或EDT:

Since 2007, the local time changes at 02:00 EST to 03:00 EDT on the second Sunday in March and returns at 02:00 EDT to 01:00 EST on the first Sunday in November, in the U.S. as well as in Canada

然后申请DATEADD()

MB我的源代码更好地解释我的意思:

declare @t table(dt datetime) 

insert @t values ('2011-07-06T10:00:00'), ('2011-01-01T00:00:00'), ('2011-03-12T00:00:00'), 
    ('2006-07-06T10:00:00') 

select b.dt 
    , CASE 
     WHEN b.dt between b.[edt_start] and [edt_end] 
      THEN DATEADD(HH, -5, b.dt) 
     ELSE DATEADD(HH, -4, b.dt) 
    END 

    , CASE 
     WHEN b.dt between b.[edt_start] and [edt_end] 
      THEN '-05:00' 
     ELSE '-04:00' 
    END 

from 
(
    select a.dt 
     , DATEADD(HH, 2, CASE 
      WHEN DATEPART(WEEKDAY, a.march) = 1 
       THEN a.march 
      ELSE DATEADD(DAY, 15 - DATEPART(WEEKDAY, a.march), a.march) 
     END) [edt_start] 

     , DATEADD(HH, 2, CASE 
      WHEN DATEPART(WEEKDAY, a.november) = 1 
       THEN a.march 
      ELSE DATEADD(DAY, 8 - DATEPART(WEEKDAY, a.november), a.november) 
     END) [edt_end] 
    from 
    (
     select t.dt 
      , YEAR(t.dt) [year] 
      , CAST(CAST(YEAR(t.dt) as varchar(4)) + '03' + '01' as datetime) [march] 
      , CAST(CAST(YEAR(t.dt) as varchar(4)) + '11' + '01' as datetime) [november] 
     from @t t 
    )a 
)b 
+0

的差异GETUTCDATE()'和'GETDATE()之间''只为确定在查询运行的瞬间偏移量是有用的。这对历史数据没有太大的帮助,因为偏移可以根据当地政府的心血来潮,DST等而变化。 – ig0774

2

的mI建议您存储这些为DATETIMEOFFSET保存时区信息。

如果你需要显示的那么作为UTC日期,那么你可以使用SWITCHOFFSET

+0

当然,这需要能够计算每小时数据的偏移量, 5年的过程会有所不同。 [此MSDN博客条目](http://blogs.msdn.com/b/sqlprogrammability/archive/2008/03/18/using-time-zone-data-in-sql-server-2008.aspx)有一个草图准确(如果复杂)的解决方案。 – ig0774

+0

为什么呢?当然,你可以将它存储为datetimeoffset,并且使用它的偏移量,然后使用SELECT SWITCHOFFSET(mydatetimeoffsetcolumn,'00:00')AS myUTCD将UTC的日期输出 –

+0

我假设时间戳没有抵消。如果他们有抵消,这是没有问题的。 – ig0774