ConvertZone() 使用 TZDB SQL Server 区域支持返回 NULL

Posted

技术标签:

【中文标题】ConvertZone() 使用 TZDB SQL Server 区域支持返回 NULL【英文标题】:ConvertZone() returns NULL using TZDB SQL Server Zone Support 【发布时间】:2021-07-07 03:49:36 【问题描述】:

我们正在运行 SQL Server 2008 R2,因此对于时区我们使用Matt Johnson's SqlServerTimeZoneSupport/ 我们使用 ConvertZone 为我们的客户即时转换日期时间。澳大利亚的一些州支持夏令时,有些州不支持。无法升级 SQL Server。

我正在尝试解决 ConvertZone() 在上周的日期返回 null 的问题。可能与夏令时有关。我试过摆弄弹簧前进和后退位,但没有成功。

下面列出的是一个测试用例:

DECLARE @dates table
(
    [Start] datetime,
    [End] datetime
)

insert into @dates([Start], [End])
VALUES
('2021-04-05 06:51:06.000', '2021-04-05 06:51:06.000'),
('2021-04-05 18:47:00.000', '2021-04-05 18:47:00.000'),
('2021-04-05 19:45:24.000', '2021-04-05 20:12:00.000'),
('2021-04-05 05:29:00.000', '2021-04-05 05:29:06.000'),
('2021-04-05 11:23:32.000', '2021-04-05 11:23:32.000'),
('2021-04-05 17:23:56.000', '2021-04-05 17:23:56.000'),
('2021-04-05 06:34:56.000', '2021-04-05 06:39:30.000'),
('2021-04-05 06:51:35.000', '2021-04-05 06:54:30.000'),
('2021-04-05 08:05:48.000', '2021-04-05 08:07:30.000'),
('2021-04-05 08:34:09.000', '2021-04-05 08:34:30.000'),
('2021-04-05 10:42:13.000', '2021-04-05 10:46:00.000'),
('2021-04-11 14:24:58.000', '2021-04-11 14:30:30.000'),
('2021-04-11 17:11:26.000', '2021-04-11 17:19:39.000'),
('2021-04-11 06:55:17.000', '2021-04-11 06:55:30.000'),
('2021-04-11 18:25:19.000', '2021-04-11 18:25:37.000'),
('2021-04-11 18:27:21.000', '2021-04-11 18:27:30.000'),
('2021-04-11 18:28:23.000', '2021-04-11 18:28:30.000'),
('2021-04-11 18:28:48.000', '2021-04-11 18:30:43.000')

SELECT
    [Start],
    CONVERT(datetime, Tzdb.ConvertZone([start], 'Australia/NSW', 'Australia/Queensland', 1, 1)) as StartAdjusted,
    [End],
    CONVERT(datetime, Tzdb.ConvertZone([end], 'Australia/NSW', 'Australia/Queensland', 1, 1)) as EndAdjusted
FROM @dates

Tzdb.ConvertZone() 是从上面链接的 SQLServerTimeZoneSupport git 安装的。它创建为它自己的 TZDB 架构。

所有这些调整后的日期都返回 NULL。有什么建议吗?

【问题讨论】:

The author states "或者,如果由于某种原因您必须完全在 SQL Server 中执行此操作而不转换到 Windows 时区,那么您将需要依赖诸如我的 SqlServerTimeZoneSupport 项目之类的项目。那个是有点旧而且维护得不是很好,所以如果你能提供帮助,我建议不要使用这种方法。” 我投票结束这个问题,因为它是针对组件支持团队的问题。 您可以通过在上面的答案中添加评论来尝试 ping 作者... 我实际上希望其他具有时区知识的用户发表评论。我在 git 上为作者创建了一张票。 @matt-johnson-pint 你在吗? ***.com/users/634824/matt-johnson-pint 【参考方案1】:

@matt-johnson-pint 建议我刷新我的时区表。这涉及从项目页面下载和使用 SqlTzLoader,为每个服务器运行(设置正确的连接字符串)。我很困惑,因为如果成功它不会输出任何文本,但它解决了这个问题。我的测试用例现在很好。

【讨论】:

以上是关于ConvertZone() 使用 TZDB SQL Server 区域支持返回 NULL的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL开发中动态SQL的使用方法

sql SQL使用密码创建SQL登录

使用sql语句查询日期的方法

使用 .sql 文件和 SQL*Plus 报告 SQL 语句成功/失败

如何在SQL语句中使用FUNCTION

如何使用oracle提供的SQL