想知道我这样做是否正确,或者我是否走得太远或不够远。我有一个调度/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