5

我的数据库应用程序将部署在不同时区的多个站点。

我需要一个 T-SQL 函数来确定今年 1 月 1 日午夜的 UTC 时间戳以进行 YTD 计算。所有数据都存储在 UTC 时间戳中。

例如,芝加哥是 UTC-6 夏令时 (DST),如果在 2008 年的任何时间在芝加哥运行,该函数需要返回“2008-01-01 06:00:00”。如果明年在纽约 (GMT-5 + DST) 运行,则需要返回 '2009-01-01 05:00:00'。

我可以从YEAR(GETDATE()). 我想我可以做一个DATEDIFFbetween GETDATE()andGETUTCDATE()来确定偏移量,但结果取决于查询是否在 DST 期间运行。我不知道任何用于确定偏移量或当前时间是否为 DST 的内置 T-SQL 函数?

有没有人在 T-SQL 中解决这个问题?我可以对其进行硬编码或将其存储在表格中,但不希望这样做。我想这是在 SQL Server 2005 中使用 CLR 集成的完美情况。我只是想知道是否有我不知道的 T-SQL 解决方案?

4

3 回答 3

2

查看之前的问题和答案以获取相关信息:

在 SQL 2005 中有效地在 UTC 和本地(即 PST)时间之间转换日期

(总而言之,您确实需要在 Sql Server 2005 中构建时区和 DST 表。在 Sql Server 的下一个版本中,我们会在时区方面获得一些帮助。)

于 2008-10-08T00:05:47.143 回答
0

嗯,我想我不明白这个问题。如果数据库应用程序已经为它的所有事务存储了 UTC 时间戳,并且您想要总结自年初“本地时间”以来的一些值,那么您的条件必须类似于:

(timestamp + (getutcdate() - getdate())) > cast('01/01/2008' as datetime)

DST 可以打开关闭,具体取决于查询运行年份的时间 - 但getdate()会将其考虑在内,因此您必须每次都动态计算偏移量。

于 2008-10-07T22:27:07.623 回答
0

除非我弄错了,否则 GETUTCDATE() 函数使用服务器上定义的时区——它没有关于客户端时区(或任何时区)的信息。我不认为这些信息存储在 SQL Server 2005 的任何地方,这使得它无法计算这些信息。

也许您可以从Oracle 的时区文件中“借用”数据并构建您自己的 SQL Server 函数?

离题(可能对其他人有用)但如果您使用的是 Oracle,则可以使用 FROM_TZ 函数和“AT TIME ZONE”:

FROM_TZ(YOUR_TIMESTAMP, 'UTC') AT TIME ZONE 'America/Dawson_Creek'
于 2008-10-07T22:29:32.767 回答