Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 为不同时区的数据库操作getdate()的结果_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 2008 为不同时区的数据库操作getdate()的结果

Sql server 2008 为不同时区的数据库操作getdate()的结果,sql-server-2008,tsql,Sql Server 2008,Tsql,我有一个在不同时区运行的支持有限的应用程序。本质上,应用程序有一个数据库/环境用于西部成本,一个用于东部成本 应用程序使用getdate()计算当前时间 我们没有源代码,所以不能用自定义函数替换getdate。有什么方法可以覆盖Getdate函数吗?或者可以为不同的数据库配置不同的时区吗?不同的实例如何?SQL Server直接从主机操作系统获取时间-它不知道时区,在一台服务器上,无法说此数据库或此实例位于此时区,而此其他数据库或其他实例位于此其他时区。实现这一点的唯一方法是使用完全不同的服务器

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

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


我们没有源代码,所以不能用自定义函数替换getdate。有什么方法可以覆盖Getdate函数吗?或者可以为不同的数据库配置不同的时区吗?不同的实例如何?

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

您应该使用或存储UTC时间。这样,您就不需要知道数据来自哪个时区,而且将其转换为这些时区(或以后需要支持的任何其他时区)总是很容易的。例如,ASP.NET具有

您可以使用重写源代码正在发送的任何内容,并忽略它们发送的任何内容
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

您也可以考虑新的数据类型,但由于它不是DST感知的,所以我不确定它是否对您的方案有价值。

< P>SQLServer直接从主机操作系统开始它的时间-它不是时区感知的,并且在一个服务器上没有办法说这个数据库或这个实例在这个时区,而另一个数据库或其他实例位于另一个时区。实现这一点的唯一方法是使用完全不同的服务器并关闭任何日期/时间同步服务(如果它们是虚拟机,则包括来自主机)

您应该使用或存储UTC时间。这样,您就不需要知道数据来自哪个时区,而且将其转换为这些时区(或以后需要支持的任何其他时区)总是很容易的。例如,ASP.NET具有

您可以使用重写源代码正在发送的任何内容,并忽略它们发送的任何内容
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

您也可以考虑新的数据类型,但是由于它不是DST知道的,所以我不确定它是否对您的方案有价值。