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

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

有人有T-SQL解决此问题的方法吗?我可以硬编码或将其存储在表中,但最好不要这样做。我想这是使用SQL Server 2005中CLR集成的完美情况。我只是想知道是否有我不知道的T-SQL解决方案?

3个回答

2

谢谢Eric。我已经像你之前建议的那样实现了一个基于表格的解决方案。我只是想知道是否有什么我错过的东西可以让我的生活更轻松。 - Andy Frieders

0
嗯,我想我还是没有理解这个问题。如果数据库应用程序已经为其所有交易存储了UTC时间戳,并且您想要自本年度以来“当地时间”总结一些值,则您的条件必须类似于:
(timestamp + (getutcdate() - getdate())) > cast('01/01/2008' as datetime)

夏令时可以是开启关闭,这取决于查询运行的时间 - 但getdate()会考虑到它,因此您必须每次动态计算偏移量。


偏移量将相对于当前日期,而不是未来的任意日期。此外,它将相对于服务器的时区,而不是客户端的时区。 - neonski

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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接