2008-10-07 45 views
5

我的数据库应用程序将部署在不同时区的多个站点上。确定T-SQL中的时区偏移

我需要一个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())获取当前年份。我认为我可以在GETDATE()和GETUTCDATE()之间做一个DATEDIFF来确定偏移量,但结果取决于查询是否在DST期间运行。我不知道任何内置的T-SQL函数用于确定偏移量还是当前时间是否为DST?

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

回答

2

看看这个以前的问题和答案相关信息:

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

(。总之,你需要建立在SQL Server 2005时区和DST表在SQL Server的下一个版本,我们得到一些帮助时区)

+0

谢谢埃里克。我已经实施了一种基于表格的解决方案,就像您以前所建议的那样。我只是想知道是否有什么我错过了会让我的生活更轻松。 – 2008-10-09 22:07:51

0

嗯,我想我不理解问题。如果数据库应用程序已经存储了所有交易的UTC时间戳 - 而且您想总结自今年第一个“当地时间”以来的一些数值,那么您的情况必须是这样的:

(时间戳+ (GETUTCDATE() - GETDATE()))> CAST('01/01/2008' 作为日期时间)

的DST可以关闭根据当年度的查询运行 - 但getdate()将它考虑在内,所以您必须每次动态计算偏移量。

我......想...... :-)

+0

抵消将相对于当前日期,而不是未来的任意日期。此外,它将相对于服务器的时区,而不是客户端的时区。 – neonski 2008-10-07 22:31:15

0

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

也许你可以从Oracle's time zone file'借用'数据并建立自己的SQL Server功能?

题外话(可能是别人有用的),但如果你使用的是Oracle,你可以使用“AT TIME ZONE”的FROM_TZ功能:

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