【问题标题】:SQL Handling Date/Time in UTCUTC 中的 SQL 处理日期/时间
【发布时间】:2015-01-08 19:09:53
【问题描述】:

我正在使用 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

转换后的UTC = 2015-01-08 23:45:00.000

convertedLocal = 2015-01-09 06:45:00.000

示例:Bob 为 2015 年 1 月 8 日下午 1:00 创建了一个会议,他们位于亚利桑那州。我需要将该时间转换为 UTC,因此当 Jim 从奥马哈过来并查看会议列表时,它会根据他的偏移量显示调整后的时间。

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

【问题讨论】:

  • 我强烈建议您查看 SQL 中的 DATETIMEOFFSET 数据类型。

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


【解决方案1】:

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

【讨论】:

  • 谢谢我正在使用 SQL Server 2012。你知道我如何将时间转换为本地时间给定与 UTC 的偏移量吗?
  • 您在 SQL Server 中使用了 SWITCHOFFSET() 函数。
【解决方案2】:

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

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

如果你想使用这种数据类型在偏移量之间切换,你可以使用SWITCHOFFSET()函数

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

【讨论】:

    猜你喜欢
    • 2019-11-26
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多