在 SQL/数据库级别计算夏令时 (DST)

Posted

技术标签:

【中文标题】在 SQL/数据库级别计算夏令时 (DST)【英文标题】:Calculate Daylight Savings Time (DST) on SQL/Database level 【发布时间】:2011-05-07 16:08:22 【问题描述】:

我在澳大利亚悉尼的位置。我解释的日期将采用英国或澳大利亚日期格式。

注意以下几点:

2010-04-15 04:30:00.000 => 15/04/2010 14:30:00 EST(英国日期格式 - 增加 10 小时) 2010-11-05 01:00:00.000 => 2010 年 5 月 11 日 12:00:00 EST(英国日期格式 - 增加 11 小时)

这两个时间都以 UTC 格式从数据库中检索出来,然后在 Web 级别计算无论 +10 小时还是 +11 小时都适用。

在澳大利亚,夏令时 (DST) 过渡日期每年都不同。过渡日期通常是四月初和十月下旬。

那么网络计算的准确度如何?如果今年的过渡日期在几天后(例如 03/04/2010),但网络计算基于固定日期(例如 01/04/2010),这是否意味着两者之间的日子将是显示时关闭 1 小时(由于每月特定日期的固定计算性质)?

我认为过渡日期不是预先确定的,实际上是向公众宣布的。这个假设是真的吗?

如果不是(这意味着 DST 日期是预先确定的),我是否能够在 Web 级别之外(在 SQL/数据库级别)进行计算?

数据库是 SQL Server 2005,我使用 报告定义语言 (RDL) 以 UTC 时间显示字段。如果 SQL/数据库级别不是最好的方法,我如何计算 +10 或 +11 并相应地格式化时间以显示正确的时间?

谢谢。

【问题讨论】:

在澳大利亚,是否有一些关于过渡的固定模式?这个问题的原因是,有一个 TZ 数据库可以跟踪这些变化。检查是否在 TZ 数据库中捕获了这些变化。 另一个为什么在数据库中使用整数纪元时间会产生奇迹的例子。 【参考方案1】:

数据库对它来说是一个糟糕的选择:它比 c# 或 .net 拥有更少的信息来解决它。 .net 使用通过补丁定期更新的注册表。 SQL Server 必须有一个包含日期范围和偏移量的表。

由于日程安排(航班、火车等),转换是固定的。 IIRC它最近在澳大利亚的一些奥运会上只在短时间内改变了一次,它在世界范围内引起了混乱。 2007 年的US changed 但这是提前知道的。

固定,即使日期不同,它也是固定的“上周日”类型。

我会把它留在网络代码中:例如,数据库不知道你的调用者在哪里,网站可以解决它。

【讨论】:

我正在使用报表定义语言 (RDL) 以 UTC 时间显示字段,我如何计算出 +10 或 +11 并根据显示正确的时间格式化时间? AFAIK,s-s-rS 不支持时区。它可以在 javascript 中完成,但我不确定这是否有用。 在我们的场景中,我们让用户以文本形式输入预定的日期和时间。这样它们就不必以 GMT 格式存储。这解决了我们的问题,因为预定的日期和时间因位置而异。悉尼是 GMT +10,珀斯是 GMT +6。因此,即使我们要生成具有正确 DST 调整的报告,我们仍然必须决定是 +10 还是 +6,这更加复杂(即使我们有位置数据来确定要添加哪个)。基本上现在当某事被安排时,它会附加开始时间和结束时间后缀。【参考方案2】:

问题是编写此应用程序的人不太了解 UTC、它的价值以及如何使用它。数据库是 dat 的正确位置,但系统未按预期使用 UTC。

如果您使用 UTC,那么您所有的日期算术都应该使用 UTC。在数据库中。它当前正在使用保存的 UTC,然后在某些(无论是第二层还是第三层)其他层进行转换;其他一些图书馆。一半 UTC,一半其他。您是否考虑过历史日期,例如 2010 年 2 月 15 日到今天之间的 DATEDIFF() 是多少?

这消除了对澳大利亚或格陵兰 DST 的担忧。并关注转换实际发生的日期/时间。每个人都在那天使用格林威治标准时间。

在 db 中使用 UTC 进行所有日期算术运算。并(仅)在本地时区显示结果,正如您所拥有的那样,它是基于用户的 web 层。

许多系统完全放弃了最后一步,并且仅以 UTC 显示,而与用户所在的时区无关。

【讨论】:

好点。例如,我们在 Web GUI 中为远东地区的用户显示瑞士时间(主要是出于遗留原因,但没有人要求提供当地时间......)【参考方案3】:

数据库可以为您处理夏令时。使用它的时区转换功能从您存储日期的任何区域转到您想要为用户获取的任何区域。

mysql 有 CONVERT_TZ(),我不知道其他 RDBMS 有什么。

【讨论】:

嗨,丹,我使用的是 SQL Server 2005。

以上是关于在 SQL/数据库级别计算夏令时 (DST)的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 日期时间列中标记夏令时 (DST) 小时

检测当前是不是启用 DST

计算 DST 转换边界处的持续时间(向前/后退的数量)

Android 夏令时 (DST) 问题

当时区有 dst 更新时,我如何安排活动

确定夏令时 (DST) 在 Java 中是不是在指定日期处于活动状态