确定T-SQL中的时区偏移量

时间:2008-10-07 22:02:39

标签: sql sql-server sql-server-2005 timezone

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

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

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

我可以从YEAR(GETDATE())获得当前年份。我以为我可以在DATEDIFFGETDATE()之间执行GETUTCDATE()来确定偏移量,但结果取决于查询是否在DST期间运行。我不知道有任何内置的T-SQL函数来确定偏移量或当前时间是否为DST?

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

3 个答案:

答案 0 :(得分:2)

查看此前一个问题并回答相关信息:

Effectively Converting dates between UTC and Local (ie. PST) time in SQL 2005

(总而言之,您需要在Sql Server 2005中构建时区和DST表。在下一版本的Sql Server中,我们可以获得有关时区的帮助。)

答案 1 :(得分:0)

嗯,我想我不是在理解这个问题。如果数据库应用程序已经存储了所有事务的UTC时间戳,并且您想要在“本地时间”的第一年之后总结一些值,那么您的条件必须类似于:

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

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

答案 2 :(得分:0)

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

也许您可以“借用”Oracle's time zone file中的数据并构建自己的SQL Server函数?

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

FROM_TZ(YOUR_TIMESTAMP, 'UTC') AT TIME ZONE 'America/Dawson_Creek'