【问题标题】:SQL Server How to persist and use a time across different time zonesSQL Server 如何跨不同时区保持和使用时间
【发布时间】:2023-03-23 13:45:01
【问题描述】:

在 SQL Server 中,我想创建一个表来节省事件的时间,并想将其转换为用户选择的时区以供显示。假设如果在格林威治标准时间下午 1:00 在伦敦发生事件,那就是美国东部标准时间上午 8:00。

鉴于这个例子我想创建一个框架,

  1. 用户可以在哪里保存事件和时间(给出事件的时区)

  2. 阅读那些事件,时间显示在他喜欢的时区(美国东部标准时间)

如何在 SQL Server 中完成此操作。

【问题讨论】:

  • SQL Server 的哪个版本? SQL Server 2008 有一个新的数据类型DATETIMEOFFSET,它是一个包含时区偏移量的 DATETIME - 非常适合您的情况

标签: sql datetime timezone


【解决方案1】:

在 SQL Server 2008 中,使用 DATETIMEOFFSET 数据类型,它是 DATETIME 加上包含的时区偏移量。

SELECT CAST('2010-11-23 16:35:29+09:00' AS datetimeoffset) 

将是 2010 年 11 月 23 日下午 4:35,时区 +9 小时(从 GMT 算起)。

SQL Server 2008 还包含将DATETIMEOFFSET 值从一个时区转换为另一个时区的函数和 SQL 命令:

SELECT 
SWITCHOFFSET(CAST('2010-11-23 16:35:29+09:00' AS datetimeoffset), '+01:00')

会导致:

2010-11-23 08:35:29.0000000 +01:00

同一时间,不同时区(格林威治标准时间+1 小时)

【讨论】:

    【解决方案2】:
    1. 保存数据时,请保存 GMT,而不是用户的本地时间(在 c# 中为 DateTime.UtcNow
    2. 在您的应用程序逻辑中,记录用户的时区,并在运行时使用时区偏移量将 GMT 时间转换为用户的本地时间。

    【讨论】:

    • GMT != UTC :查看@chezy 帖子的评论
    【解决方案3】:

    我解决类似问题的方法是执行以下操作:

    1. 表的设计是只存储 GMT 时间。
    2. 所有输入都通过需要输入时区偏移量的存储过程。
    3. 数据请求发送到Table-Valued Function,并带有时区偏移量的输入。

    【讨论】:

    猜你喜欢
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2017-08-04
    • 2014-08-27
    • 1970-01-01
    • 2012-06-13
    • 2012-01-06
    相关资源
    最近更新 更多