是否可以更改 SQL Server 上特定数据库的日期时间?
它与操作系统的日期/时间有关吗?
我们希望模拟未来的日期时间以进行测试,即GETDATE()
返回未来的日期。
它必须在半生产(暂存)环境中,因此不幸的是,更改操作系统日期/时间不是我们的选择。
在一个理想的世界里,我们会启动一个虚拟服务器,但目前也不是一个真正的选择。
是否可以更改 SQL Server 上特定数据库的日期时间?
它与操作系统的日期/时间有关吗?
我们希望模拟未来的日期时间以进行测试,即GETDATE()
返回未来的日期。
它必须在半生产(暂存)环境中,因此不幸的是,更改操作系统日期/时间不是我们的选择。
在一个理想的世界里,我们会启动一个虚拟服务器,但目前也不是一个真正的选择。
不幸的是,它与操作系统的日期和时间有关。见这里:http: //msdn.microsoft.com/en-us/library/ms188383.aspx
此值源自运行 SQL Server 实例的计算机的操作系统。
正如其他人所说,不。
一个非常棘手的解决方法是编写自己的函数来返回您想要的日期,并在您完成测试时让它返回 GETDATE(),然后调用该函数。这样做可能会有一些轻微的开销,但它会做你需要的。
您始终可以使用它并进行相应调整:
SELECT getutcdate()
请参阅下面的更多信息 StackOverflow 问题
但是,如果GETDATE()
不更改服务器的日期,就无法更改结果。
EXEC xp_cmdshell 'DATE 10/10/2011'
......但不建议这样做。
我取得了一些成功的另一个解决方法是向任何插入 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
(顺便说一句,where 子句在那里,因为我的测试脚本自动生成这些触发器,为每个 datetime 列添加更新,所以我只想更新那些看起来像是用 GETDATE() 值插入的那些。)