SQL处理日期/时间(UTC)

时间:2015-01-08 19:09:54

标签: javascript sql-server date datetime sql-server-2012

我正在使用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从奥马哈出来并查看会议列表时,它会根据他的偏移量显示调整后的时间。

有关如何正确处理此问题的任何提示?

2 个答案:

答案 0 :(得分:0)

您可以查看datetimeoffset构造。或者你可以把时间从本地机器而不是数据库服务器上拉下来。

http://msdn.microsoft.com/en-us/library/bb630289.aspx

如果要使用此数据类型在偏移之间切换,可以使用SWITCHOFFSET()函数

http://msdn.microsoft.com/en-us/library/bb677244.aspx

答案 1 :(得分:0)

我的建议是在数据访问代码而不是数据库本身处理这个问题。您以UTC格式存储时间是正确的,但它应该是负责在用户的区域设置中显示时间的应用程序层。如果你绝对必须在数据库中这样做,那么使用转换函数而不是DATEADD来在正确的时区显示日期而不是操纵它。你没有提到你正在使用的数据库,但是例如MySQL有CONVERT_TZ()函数,它将在给定的时区显示日期。