关于sql server 2008:为不同时区的数据库操作getdate()的结果

Manipulate the results of getdate() for databases in different time zones

我的应用程序支持在不同时区运行。 从本质上讲,该应用程序有一个用于西部成本的数据库/环境,一个用于东部成本。

应用程序使用getdate()计算当前时间。

我们没有源代码,因此无法使用自定义函数替换getdate。 有没有办法覆盖Getdate函数? 或者是否可以为不同的数据库配置不同的时区? 不同的情况怎么样?


SQL Server直接从主机操作系统中获取时间 - 它不是时区感知的,并且在一台服务器上无法说这个数据库或此实例在此时区中,并且此其他数据库或其他实例在此其他时区。您能够实现这一目标的唯一方法是拥有完全不同的服务器并关闭任何日期/时间同步服务(如果它们是虚拟机,则包括来自主机)。

您应该使用GETUTCDATE()SYSUTCDATETIME()存储UTC时间。然后,您不需要知道一个数据来自哪个时区,并且很容易将其转换为这些时区中的任何一个(或者您需要稍后支持的任何其他时区)。例如,ASP.NET具有非常广泛的时区支持。

您可以使用INSTEAD OF INSERT触发器覆盖源代码发送的任何内容,并忽略发送GETDATE()的任何内容。一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
CREATE TRIGGER dbo.whatever
ON dbo.tablename
INSTEAD OF INSERT
AS
BEGIN
  SET NOCOUNT ON;

  INSERT dbo.tablename(col1, col2, date_created)
    SELECT col1, col2, SYSUTCDATETIME() FROM inserted;
    -------------------^^^^^^^^^^^^^^ this overrides what they passed
END
GO

您还可以考虑新的TIMEZONEOFFSET数据类型,但由于它不支持DST,因此我不确定它对您的方案是否有价值。