将本地最终用户转换为UTC并返回

时间:2018-12-04 00:05:06

标签: sql-server tsql sql-server-2016

想知道我是否正确执行此操作,或者我走得太远或不够远。 我有一个调度/ POS系统,每个位置都有自己的数据。

每个位置都会报告自己的数据。 “所有者”将能够为所有位置生成报告。

我将日期时间存储为UTC。

每个位置都存储了时区。

最终用户将约会信息传递给调用存储过程的应用程序。这样会获取存储的时区位置,并将本地转换为UTC。

DECLARE @offeset VARCHAR(6)
SELECT @offeset = tz.current_utc_offset FROM sys.time_zone_info tz
INNER JOIN Location cl ON cl.TimeZoneStandardName = tz.[name]
WHERE cl.LocationID = @locationID

DECLARE @newStart DATETIME = dbo.fnConvertLocalToUTC(@startTimeLocal, @offset)
DECLARE @newEnd DATETIME = dbo.fnConvertLocalToUTC(@endTimeLocal, @offset)

功能:fnConvertLocalToUTC

ALTER function [dbo].[fnConvertLocalToUTC](
@datetime datetime2,
@offset varchar(6)
)
returns datetime2
as
BEGIN
return SWITCHOFFSET(CONVERT(datetimeoffset, CONVERT(varchar, @datetime, 121) + ' ' + @offset), 0)
END

提取今天的约会列表,我创建了一个视图,其中包含以下内容,可以将UTC转换回其当地时间。

SELECT ....
    , CONVERT(VARCHAR(19), dbo.fnConvertUTC(a.StartTimeUTC, cl.TimeZoneStandardName), 120) AS StartTime
    , CONVERT(VARCHAR(19), dbo.fnConvertUTC(a.EndTimeUTC, cl.TimeZoneStandardName), 120) AS EndTime
FROM Appointment a
INNER JOIN Location cl ON cl.LocationID = a.LocationID
WHERE 
    CAST(dbo.fnConvertUTC(a.StartTimeUTC, cl.TimeZoneStandardName) AS DATE) = CAST(dbo.fnConvertUTC(GETUTCDATE(), cl.TimeZoneStandardName) AS DATE)

功能:fnConvertUTC

ALTER function [dbo].[fnConvertUTC](
@datetime datetime2,
@timezonename varchar(60)
)
returns datetime2
as
BEGIN
return CONVERT(datetime, SWITCHOFFSET(@datetime, DATEPART(TZOFFSET, @datetime AT TIME ZONE @timezonename)))
END

0 个答案:

没有答案