0

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

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

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

4

1 回答 1

4

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

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

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

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,我不确定它是否对您的方案有价值。

于 2013-01-30T00:05:30.173 回答