sql - 夏令时和 UTC 时间

标签 sql sql-server t-sql dst

我们使用一个以 UTC 时间保存时间戳的程序。我们是犹他州本地公司,因此受到夏令时的影响。

例如,如果我们现在接到电话,时间为 12:52:00 MST,它将在数据库中保存为 19:52:00

我首先担心的是明年 DST 将于 2016 年 3 月 13 日再次开始,我会在同一时间运行此操作。 UTC 时间戳是 18:52:00 还是保持在 19:52:00

我的第二个问题是,如果我将数据库中的日期转换为本地时间,那么我必须首先检查是否为夏令时,然后如果是-6,如果不是-7?

所以使用上面的例子:

IsDST = 01:52:00 (-6)
IsNotDST = 12:52:00 (-7)

我认为这是我需要担心的与 UTC 之间转换的问题?

除了上述两个问题之外,我的主要问题是。 SQL Server/T-SQL 中是否有内置的东西可以为我处理这种转换,还是我需要自己编写所有内容来满足需要?

我已经开始了,但如果有必要,现在需要在 DST 中工作

DECLARE @declared_start_datetime DATETIME, 
        @declared_end_datetime DATETIME, 
        @converted_start_datetime DATETIME, 
        @converted_end_datetime DATETIME

SET @declared_start_datetime = '11/04/2015 07:00:00' -- Hour we open phones
SET @declared_end_datetime = '11/04/2015 18:00:00' -- Hour we close phones
SET @converted_start_datetime = DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), @declared_start_datetime)
SET @converted_end_datetime = DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), @declared_end_datetime)

select @declared_start_datetime as 'Declared Start', 
       @declared_end_datetime as 'Declared End'
select @converted_start_datetime as 'Converted Start',
       @converted_end_datetime as 'Converted End'

最佳答案

For example if we receive a call right now it is 12:52:00 MST and it would be saved in the database as 19:52:00.

My first concern is next year when DST starts again on March 13th 2016 and I run this at the exact same time. Will the time stamp in UTC be then 18:52:00 or would it stay at 19:52:00?

山区标准时间为 UTC-7,美国山区夏令时间为 UTC-6。如果您写出转换中涉及的完整日期、时间和偏移量,则更容易推理。这是标准 ISO8601 扩展格式:

2015-11-06T12:52:00-07:00 = 2015-11-06T19:52:00Z
2016-03-13T12:52:00-06:00 = 2016-03-13T18:52:00Z

等式左侧的每个本地时间都标有正确的本地时间和该时间的本地偏移量。然后,要获取 UTC(由 Z 标识),您只需从本地时间中减去偏移量即可。或者,将其视为反转符号并添加,如果这样更容易合理化。

所以是的,它会将其存储在 18:52:00当您在白天时为 UTC。这是正确的行为。

My second concern is if I convert the date in the database to my local time so I have to first check if it DST and then if it is take the time -6 and if not it would be -7?

是的,但请记住,它是您要转换的时间戳反射(reflect)的日期和时间。无论您当前是否处于夏令时,都没有什么区别。

但是,请记住,如果大家可以帮助的话,通常应该在数据库层避免时区转换。在绝大多数用例中,这是应用程序层的问题。

例如,如果您从 .NET 内置的应用程序写入 SQL Server,则可以使用 TimeZoneInfo"Mountain Standard Time" 一起上课ID(适用于 MST 和 MDT)。或者,您可以使用 Noda Time图书馆 TZDB "America/Denver"的标识符.

通过使用库,您不必关心 DST 何时开始和停止的所有各种细节,也不必关心 DST 在世界不同地区的历史上如何变化。

在极少数情况下,您实际上需要在数据库级别完成时区转换,您当然可以编写自己的存储过程或 UDF(例如链接到的一些问题评论),但根据您的需要,它们可能还不够。通常,他们倾向于只编码一组用于时区转换的固定规则,因此他们不会考虑其他时区或历史变化。

SQL Server 有一些通用时区解决方案,但与其他数据库平台不同的是,它没有内置任何内容。我会推荐我的SQL Server Time Zone Support OSS项目,你搜一下还有其他的。但实际上,您应该希望不需要需要这个,并且应该尽可能在应用程序层中进行转换。

更新:在 SQL Server 2016 CTP 3.1 中,现在通过 AT TIME ZONE 提供对时区的内置支持。陈述。请参阅the CTP announcement for examples .

关于sql - 夏令时和 UTC 时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33553748/

相关文章:

mysql - SQL 以独立于数据库的方式填充零(LPAD)

c# - 检测 SQL Server 是否正在运行

c# - 获取第一个表插入的值到第二个表

T-SQL 查询批量处理数据而不破坏组

javascript - 如何将文本字段中的填充值保存到 Ionic 6/Capacitor 中的 SQLite 数据库?

sql - 删除不必要的索引 - 对 SQL Server 2005 中的查询计划的影响

mysql - 如何计算和连接来自不同数据库的 mySQL 上的两个表?

c# - 如何在运行时在 C# 中获取表的列名?

sql-server - 将 TSQL 中的字符串处理为带时区的日期时间

sql-server - 使用从 sql 函数获取的值时 ORDER BY