SQL Server - Convert date field to UTC

前端 未结 12 569
故里飘歌
故里飘歌 2020-12-23 13:39

I have recently updated my system to record date/times as UTC as previously they were storing as local time.

I now need to convert all the local stored date/times to

12条回答
  •  礼貌的吻别
    2020-12-23 13:58

    I'm a bit late to the game but I needed to do something like this on SQL 2012, I haven't fully tested it yet but here is what I came up with.

    CREATE FUNCTION SMS.fnConvertUTC
    (
        @DateCST datetime
    )
    RETURNS DATETIME
    AS
    BEGIN
        RETURN 
            CASE 
            WHEN @DateCST 
                BETWEEN 
                    CASE WHEN @DateCST > '2007-01-01' 
                    THEN CONVERT(DATETIME, CONVERT(VARCHAR,YEAR(@DateCST)) + '-MAR-14 02:00') - DATEPART(DW,CONVERT(VARCHAR,YEAR(@DateCST)) + '-MAR-14 02:00' ) + 1
                    ELSE CONVERT(DATETIME, CONVERT(VARCHAR,YEAR(@DateCST)) + '-APR-07 02:00') - DATEPART(DW,CONVERT(VARCHAR,YEAR(@DateCST)) + '-APR-07 02:00' ) + 1 END
                AND
                    CASE WHEN @DateCST > '2007-01-01' 
                    THEN CONVERT(DATETIME, CONVERT(VARCHAR,YEAR(@DateCST)) + '-NOV-07 02:00') - DATEPART(DW,CONVERT(VARCHAR,YEAR(@DateCST)) + '-NOV-07 02:00' ) + 1
                    ELSE CONVERT(DATETIME, CONVERT(VARCHAR,YEAR(@DateCST)) + '-OCT-31 02:00') - DATEPART(DW,CONVERT(VARCHAR,YEAR(@DateCST)) + '-OCT-31 02:00' ) + 1 END
            THEN DATEADD(HOUR,4,@DateCST)
            ELSE DATEADD(HOUR,5,@DateCST) 
            END
    END
    

    Above someone posted a static list DST dates so I wrote the below query to compare this code's output to that list... so far it looks correct.

    ;WITH DT AS 
    ( 
        SELECT MyDate = GETDATE() 
        UNION ALL 
        SELECT MyDate = DATEADD(YEAR,-1,MyDate) FROM DT
        WHERE DATEADD(YEAR,-1,MyDate) > DATEADD(YEAR, -30, GETDATE())
    )
    SELECT 
        SpringForward = CASE 
            WHEN MyDate > '2007-01-01' 
            THEN CONVERT(DATETIME, CONVERT(VARCHAR,YEAR(MyDate)) + '-MAR-14 02:00') - DATEPART(DW,CONVERT(VARCHAR,YEAR(MyDate)) + '-MAR-14 02:00' ) + 1
            ELSE CONVERT(DATETIME, CONVERT(VARCHAR,YEAR(MyDate)) + '-APR-07 02:00') - DATEPART(DW,CONVERT(VARCHAR,YEAR(MyDate)) + '-APR-07 02:00' ) + 1 END
    ,   FallBackward  = CASE 
            WHEN MyDate > '2007-01-01' 
            THEN CONVERT(DATETIME, CONVERT(VARCHAR,YEAR(MyDate)) + '-NOV-07 02:00') - DATEPART(DW,CONVERT(VARCHAR,YEAR(MyDate)) + '-NOV-07 02:00' ) + 1
            ELSE CONVERT(DATETIME, CONVERT(VARCHAR,YEAR(MyDate)) + '-OCT-31 02:00') - DATEPART(DW,CONVERT(VARCHAR,YEAR(MyDate)) + '-OCT-31 02:00' ) + 1 END
    FROM DT
    ORDER BY 1 DESC
    
    SpringForward      FallBackward
    ----------------   ----------------
    2020-03-08 02:00   2020-11-01 02:00
    2019-03-10 02:00   2019-11-03 02:00
    2018-03-11 02:00   2018-11-04 02:00
    2017-03-12 02:00   2017-11-05 02:00
    2016-03-13 02:00   2016-11-06 02:00
    2015-03-08 02:00   2015-11-01 02:00
    2014-03-09 02:00   2014-11-02 02:00
    2013-03-10 02:00   2013-11-03 02:00
    2012-03-11 02:00   2012-11-04 02:00
    2011-03-13 02:00   2011-11-06 02:00
    2010-03-14 02:00   2010-11-07 02:00
    2009-03-08 02:00   2009-11-01 02:00
    2008-03-09 02:00   2008-11-02 02:00
    2007-03-11 02:00   2007-11-04 02:00
    2006-04-02 02:00   2006-10-29 02:00
    2005-04-03 02:00   2005-10-30 02:00
    2004-04-04 02:00   2004-10-31 02:00
    2003-04-06 02:00   2003-10-26 02:00
    2002-04-07 02:00   2002-10-27 02:00
    2001-04-01 02:00   2001-10-28 02:00
    2000-04-02 02:00   2000-10-29 02:00
    1999-04-04 02:00   1999-10-31 02:00
    1998-04-05 02:00   1998-10-25 02:00
    1997-04-06 02:00   1997-10-26 02:00
    1996-04-07 02:00   1996-10-27 02:00
    1995-04-02 02:00   1995-10-29 02:00
    1994-04-03 02:00   1994-10-30 02:00
    1993-04-04 02:00   1993-10-31 02:00
    1992-04-05 02:00   1992-10-25 02:00
    1991-04-07 02:00   1991-10-27 02:00
    
    (30 row(s) affected)
    

提交回复
热议问题