我正在使用SQL来创建会议/活动。会议需要保存为UTC,然后根据他们正在查看会议的时区向最终用户显示。
由于最终用户可以选择会议时间,我需要将该时间转换为UTC。从那里,我将从本地用户传递偏移量并将其转换为当地时间。
以下是我所做的,我猜错了,因为结果不正确:
-- Declare the local offset
DECLARE @offset INT = '420'
-- Convert a date/time to UTC
SELECT DATEADD(hh, DateDiff(hh, GetDate(), GetUTCDate()), '2015-01-08 17:45:00') AS ConvertedToUTC;
-- Convert a UTC back to local based on offset
SELECT DATEADD(minute, @offset, '2015-01-08 23:45:00.000') AS ConvertedToLocal
convertedUTC = 2015-01-08 23:45:00.000
convertedLocal = 2015-01-09 06:45:00.000
示例:Bob于2015年1月8日下午1:00创建会议,他们位于亚利桑那州。我需要将该时间转换为UTC,这样当Jim从奥马哈出来并查看会议列表时,它会根据他的偏移量显示调整后的时间。
有关如何正确处理此问题的任何提示?
答案 0 :(得分:0)
您可以查看datetimeoffset构造。或者你可以把时间从本地机器而不是数据库服务器上拉下来。
http://msdn.microsoft.com/en-us/library/bb630289.aspx
如果要使用此数据类型在偏移之间切换,可以使用SWITCHOFFSET()函数
答案 1 :(得分:0)
我的建议是在数据访问代码而不是数据库本身处理这个问题。您以UTC格式存储时间是正确的,但它应该是负责在用户的区域设置中显示时间的应用程序层。如果你绝对必须在数据库中这样做,那么使用转换函数而不是DATEADD来在正确的时区显示日期而不是操纵它。你没有提到你正在使用的数据库,但是例如MySQL有CONVERT_TZ()函数,它将在给定的时区显示日期。