我的数据库应用程序将部署在不同时区的多个站点上。
我需要一个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())
获得当前年份。我以为我可以在DATEDIFF
和GETDATE()
之间执行GETUTCDATE()
来确定偏移量,但结果取决于查询是否在DST期间运行。我不知道有任何内置的T-SQL函数来确定偏移量或当前时间是否为DST?
有没有人在T-SQL中解决这个问题?我可以硬编码或将其存储在一个表中,但不愿意。我想这是在SQL Server 2005中使用CLR集成的完美情况。我只是想知道是否有一个我不知道的T-SQL解决方案?
答案 0 :(得分:2)
查看此前一个问题并回答相关信息:
Effectively Converting dates between UTC and Local (ie. PST) time in SQL 2005
(总而言之,您需要在Sql Server 2005中构建时区和DST表。在下一版本的Sql Server中,我们可以获得有关时区的帮助。)
答案 1 :(得分:0)
(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'