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
不管你做什么,不要使用-减去日期,因为该操作不是原子操作,你会偶尔得到应有的种族系统日期时间与当地的日期时间之间的条件不确定的结果在不同的时间被检查(即非原子) 。
TA贡献1779条经验 获得超6个赞
我没有发现这些示例中的任何一个有助于将日期时间存储为UTC到指定时区的日期时间(不是服务器的时区,因为Azure SQL数据库以UTC身份运行)。这就是我处理它的方式。它并不优雅,但它很简单,无需维护其他表格即可为您提供正确的答案:
select CONVERT(datetime, SWITCHOFFSET(dateTimeField, DATEPART(TZOFFSET,
dateTimeField AT TIME ZONE 'Eastern Standard Time')))
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
添加回答
举报