模拟SQL Server实例上的当前日期?

时间:2011-11-23 17:30:20

标签: sql-server getdate

是否可以更改SQL Server上特定数据库的日期时间?

是否与操作系统的日期/时间相关?

我们希望模拟未来的日期时间以进行测试,即GETDATE()将来会返回日期。

它必须处于半生产(临时)环境中,所以不幸的是,更改操作系统日期/时间对我们来说不是一个选择。

在一个理想的世界中,我们会启动一个虚拟服务器,但目前还不是一个真正的选择。

5 个答案:

答案 0 :(得分:3)

不幸的是,它与操作系统的日期和时间有关。见这里:http://msdn.microsoft.com/en-us/library/ms188383.aspx

  

此值源自计算机的操作系统   SQL Server实例正在运行。

答案 1 :(得分:3)

正如其他人所说,没有。

一个非常糟糕的解决方法,就是编写自己的函数来返回所需的日期,并在完成测试后返回GETDATE()并调用该函数。这样做可能会有一些轻微的开销,但它会做你需要的。

答案 2 :(得分:2)

您可以随时使用此功能并进行相应调整:

SELECT getutcdate()

请参阅以下内容以获取更多信息 StackOverflow Question

但是在没有更改服务器日期的情况下,无法更改GETDATE()的结果。

<小时/> 的加了: 如果你愿意,你可以做EXEC xp_cmdshell 'DATE 10/10/2011'但是不建议。

答案 3 :(得分:2)

我取得了一些成功的另一种解决方法是将INSTEAD OF触发器添加到任何插入GETDATE()值的表中并在那里修改它,例如:

ALTER TRIGGER [dbo].[AccountsPayableReceivable_trg_i] ON [dbo].[AccountsPayableReceivable]
INSTEAD OF INSERT
AS
  SET NOCOUNT ON

  SELECT *
  INTO #tmp_ins_AccountsPayableReceivable
  FROM INSERTED

  UPDATE   #tmp_ins_AccountsPayableReceivable 
  SET    dtPaymentMade = '01-Jan-1900'
  WHERE dtPaymentMade between dateadd(ss, -5, getdate()) and dateadd(ss, +5, getdate())

  INSERT INTO AccountsPayableReceivable
  SELECT *
  from #tmp_ins_AccountsPayableReceivable

(顺便说一下,where子句就在那里,因为我的测试脚本会自动生成这些触发器,为每个datetime列添加一个更新,所以我只想更新看起来像是用GETDATE()值插入的那些。)< / p>

答案 4 :(得分:0)

我相信你可以创建一个用户函数来为你做计算并应用它。

http://msdn.microsoft.com/en-us/library/ms186755.aspx

此外,它可以用作列的默认值。

Bind a column default value to a function in SQL 2005