3 回答

TA貢獻1864條經(jīng)驗 獲得超6個贊
您可以在SQL Server 2008或更高版本上執(zhí)行以下操作:
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
不管你做什么,不要使用-減去日期,因為該操作不是原子操作,你會偶爾得到應有的種族系統(tǒng)日期時間與當?shù)氐娜掌跁r間之間的條件不確定的結(jié)果在不同的時間被檢查(即非原子) 。

TA貢獻1779條經(jīng)驗 獲得超6個贊
我沒有發(fā)現(xiàn)這些示例中的任何一個有助于將日期時間存儲為UTC到指定時區(qū)的日期時間(不是服務器的時區(qū),因為Azure SQL數(shù)據(jù)庫以UTC身份運行)。這就是我處理它的方式。它并不優(yōu)雅,但它很簡單,無需維護其他表格即可為您提供正確的答案:
select CONVERT(datetime, SWITCHOFFSET(dateTimeField, DATEPART(TZOFFSET,
dateTimeField AT TIME ZONE 'Eastern Standard Time')))

TA貢獻1851條經(jīng)驗 獲得超4個贊
如果您需要服務器位置以外的轉(zhuǎn)換,此功能允許您傳遞標準偏移量并記錄美國夏令時:
-- =============================================
-- 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
添加回答
舉報