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