我目前使用以下方法从 UTC 日期时间获取本地日期时间:
SET @offset = DateDiff(minute, GetUTCDate(), GetDate())
SET @localDateTime = DateAdd(minute, @offset, @utcDateTime)
我的问题是,如果夏令时发生在GetUTCDate()
和之间@utcDateTime
,@localDateTime
最终会休息一个小时。
是否有一种简单的方法可以将非当前日期的日期从 UTC 转换为当地时间?
我正在使用 SQL Server 2005
在 SQL Server 2016 之前,将非当前 UTC 日期转换为本地时间的最佳方法是使用 Microsoft .Net 公共语言运行时或 CLR。
代码本身很简单;困难的部分通常是让人们相信 CLR 不是纯粹的邪恶或可怕......
对于众多示例之一,请查看Harsh Chawla 关于该主题的博客文章。
不幸的是,在 SQL Server 2016 之前没有任何内置可以处理这种类型的转换,除了基于 CLR 的解决方案。你可以编写一个 T-SQL 函数来做这样的事情,但是你必须自己实现日期更改逻辑,我认为这绝对不容易。
我在 codeplex 上开发并发布了T-SQL Toolbox项目,以帮助任何在 Microsoft SQL Server 中处理日期时间和时区问题的人。它是开源的,完全免费使用。
它使用简单的 T-SQL(无 CLR)以及开箱即用的预填充配置表提供简单的日期时间转换 UDF。它具有完整的 DST(夏令时)支持。
可以在表“DateTimeUtil.Timezone”(在 T-SQL 工具箱数据库中提供)中找到所有受支持时区的列表。
在您的示例中,您可以使用以下示例:
这将返回转换后的本地日期时间值。
不幸的是,SQL Server 2008 或更高版本支持它只是因为更新的数据类型(DATE、TIME、DATETIME2)。但由于提供了完整的源代码,您可以通过将表和 UDF 替换为 DATETIME 轻松调整它们。我没有可用于测试的 MSSQL 2005,但它也应该适用于 MSSQL 2005。如有问题,请告诉我。
我总是使用这个 TSQL 命令。
它非常简单,它可以完成这项工作。
对于 SQL Server 2016+,您可以使用AT TIME ZONE。它将自动处理夏令时。
我在 StackOverflow 上找到了这个答案,它提供了一个用户定义的函数,似乎可以准确地翻译日期时间
您唯一需要修改的是
@offset
顶部的变量,以将其设置为运行此函数的 SQL 服务器的时区偏移量。就我而言,我们的 SQL 服务器使用 EST,即 GMT - 5它并不完美,可能不适用于许多情况,例如半小时或 15 分钟的 TZ 偏移量(对于那些我推荐像Kevin 推荐的 CLR 函数的情况),但它适用于北方的大多数通用时区美国。
对于 Stack Overflow 上提出的类似问题,有几个很好的答案。我最终使用Bob Albright 的第二个答案中的 T-SQL 方法来清理由数据转换顾问造成的混乱。
它几乎适用于我们所有的数据,但后来我意识到他的算法只适用于早在 April 5, 1987 的日期,而且我们有一些 1940 年代的日期仍然没有正确转换。我们最终需要 SQL Server 数据库中的日期与使用 Java API 转换为本地时间
UTC
的第三方程序中的算法对齐。UTC
我喜欢Kevin Feasel 使用 Harsh Chawla 的示例的答案
CLR
中的示例,并且我还想将它与使用 Java 的解决方案进行比较,因为我们的前端使用 Java 进行本地时间转换。UTC
维基百科提到 1987 年之前涉及时区调整的 8 项不同的宪法修正案,其中许多都非常本地化到不同的州,因此 CLR 和 Java 有可能对它们进行不同的解释。您的前端应用程序代码是否使用 dotnet 或 Java,或者 1987 年之前的日期对您来说是个问题?
您可以使用 CLR 存储过程轻松完成此操作。
您可以将可用的时区存储在表中:
这个存储过程将用您服务器上可能的时区填充表格。
SQL Server 2016 版将一劳永逸地解决这个问题。对于早期版本,CLR 解决方案可能是最简单的。或者对于特定的 DST 规则(仅限美国),T-SQL 函数可以相对简单。
但是,我认为通用的 T-SQL 解决方案可能是可能的。只要
xp_regread
有效,试试这个:一个(复杂的)T-SQL 函数可以使用此数据来确定当前 DST 规则期间所有日期的确切偏移量。
这是为特定的英国应用程序编写的答案,完全基于 SELECT。
不适用于夏令时开始当天的午夜和凌晨 1 点之间。这可以更正,但为其编写的应用程序不需要它。