能否在 SQL Server 上为特定的数据库更改日期时间?
它是否与操作系统的日期/时间有关?
我们希望模拟将来的日期时间以进行测试,例如使 GETDATE()
返回未来的日期。
由于我们处于半生产(暂存)环境,所以不幸的是不能更改操作系统的日期/时间。
在理想情况下,我们会启动虚拟服务器,但目前也不是很可行。
能否在 SQL Server 上为特定的数据库更改日期时间?
它是否与操作系统的日期/时间有关?
我们希望模拟将来的日期时间以进行测试,例如使 GETDATE()
返回未来的日期。
由于我们处于半生产(暂存)环境,所以不幸的是不能更改操作系统的日期/时间。
在理想情况下,我们会启动虚拟服务器,但目前也不是很可行。
很不幸,它与操作系统的日期和时间绑定在一起。请参见此处:http://msdn.microsoft.com/en-us/library/ms188383.aspx
此值来自运行SQL Server实例的计算机的操作系统。
Set-Date
命令 (http://technet.microsoft.com/en-us/library/ee176960.aspx),但它会更改您的操作系统日期和时间。 - user596075SELECT getutcdate()
GETDATE()
的结果。
EXEC xp_cmdshell 'DATE 10/10/2011'
,但这并不被建议。正如其他人所说,不行。
一种非常粗暴的解决方法是编写自己的函数来返回所需的日期,并在测试完成后返回GETDATE(),然后调用该函数。这样做可能会有一些轻微的开销,但它可以满足您的需求。
我曾经使用的另一种解决方法是,在任何插入GETDATE()值的表上添加一个INSTEAD OF触发器,并在那里进行修改,例如:
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