为了账号安全,请及时绑定邮箱和手机立即绑定

在select语句中将Datetime列从UTC转换为本地时间

在select语句中将Datetime列从UTC转换为本地时间

DIEA 2019-08-30 16:28:42
我正在做一些SQL选择查询,并希望将我的UTC日期时间列转换为本地时间,以便在我的查询结果中显示为本地时间。注意,我不希望通过代码进行此转换,而是在我对数据库进行手动和随机SQL查询时。
查看完整描述

3 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

您可以在SQL Server 2008或更高版本上执行以下操作:


SELECT CONVERT(datetime, 

               SWITCHOFFSET(CONVERT(datetimeoffset, 

                                    MyTable.UtcColumn), 

                            DATENAME(TzOffset, SYSDATETIMEOFFSET()))) 

       AS ColumnInLocalTime

FROM MyTable

你也可以做一些不那么冗长的事情:


SELECT DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), MyTable.UtcColumn) 

       AS ColumnInLocalTime

FROM MyTable

不管你做什么,不要使用-减去日期,因为该操作不是原子操作,你会偶尔得到应有的种族系统日期时间与当地的日期时间之间的条件不确定的结果在不同的时间被检查(即非原子) 。


查看完整回答
反对 回复 2019-08-30
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

我没有发现这些示例中的任何一个有助于将日期时间存储为UTC到指定时区的日期时间(不是服务器的时区,因为Azure SQL数据库以UTC身份运行)。这就是我处理它的方式。它并不优雅,但它很简单,无需维护其他表格即可为您提供正确的答案:


select CONVERT(datetime, SWITCHOFFSET(dateTimeField, DATEPART(TZOFFSET, 

dateTimeField AT TIME ZONE 'Eastern Standard Time')))


查看完整回答
反对 回复 2019-08-30
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

如果您需要服务器位置以外的转换,此功能允许您传递标准偏移量并记录美国夏令时:


-- =============================================

-- Author:      Ron Smith

-- Create date: 2013-10-23

-- Description: Converts UTC to DST

--              based on passed Standard offset

-- =============================================

CREATE FUNCTION [dbo].[fn_UTC_to_DST]

(

    @UTC datetime,

    @StandardOffset int

)

RETURNS datetime

AS

BEGIN


    declare 

        @DST datetime,

        @SSM datetime, -- Second Sunday in March

        @FSN datetime  -- First Sunday in November


    -- get DST Range

    set @SSM = datename(year,@UTC) + '0314' 

    set @SSM = dateadd(hour,2,dateadd(day,datepart(dw,@SSM)*-1+1,@SSM))

    set @FSN = datename(year,@UTC) + '1107'

    set @FSN = dateadd(second,-1,dateadd(hour,2,dateadd(day,datepart(dw,@FSN)*-1+1,@FSN)))


    -- add an hour to @StandardOffset if @UTC is in DST range

    if @UTC between @SSM and @FSN

        set @StandardOffset = @StandardOffset + 1


    -- convert to DST

    set @DST = dateadd(hour,@StandardOffset,@UTC)


    -- return converted datetime

    return @DST


END


GO


查看完整回答
反对 回复 2019-08-30
  • 3 回答
  • 0 关注
  • 1406 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信