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

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



DIEA
浏览 1480回答 3
3回答

慕尼黑的夜晚无繁华

您可以在SQL Server 2008或更高版本上执行以下操作:SELECT CONVERT(datetime,                SWITCHOFFSET(CONVERT(datetimeoffset,                                     MyTable.UtcColumn),                             DATENAME(TzOffset, SYSDATETIMEOFFSET())))        AS ColumnInLocalTimeFROM MyTable你也可以做一些不那么冗长的事情:SELECT DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), MyTable.UtcColumn)        AS ColumnInLocalTimeFROM MyTable不管你做什么,不要使用-减去日期,因为该操作不是原子操作,你会偶尔得到应有的种族系统日期时间与当地的日期时间之间的条件不确定的结果在不同的时间被检查(即非原子) 。

哆啦的时光机

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

繁花不似锦

如果您需要服务器位置以外的转换,此功能允许您传递标准偏移量并记录美国夏令时:-- =============================================-- 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 datetimeASBEGIN    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 @DSTENDGO
打开App,查看更多内容
随时随地看视频慕课网APP