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

7

能否在 SQL Server 上为特定的数据库更改日期时间?

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

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

由于我们处于半生产(暂存)环境,所以不幸的是不能更改操作系统的日期/时间。

在理想情况下,我们会启动虚拟服务器,但目前也不是很可行。


可能是重复的问题:更改 Getdate 的输出 - loudmummer
@loudmummer 我认为你是正确的,它们似乎是同一个问题,当时我没有遇到那个问题。这两个问题(非常古老)都吸引了有价值的见解,是否可能将它们合并? - Alex KeySmith
1
确实,这两个问题都有很好的答案。它们可以合并,但是这篇文章说只有管理员才能这样做。也许你可以标记它以引起管理员的注意? - loudmummer
5个回答

3

谢谢Shark。+1。我本来希望有某种神奇的解决方式...... :-) 我想知道是否有硬编码PowerShell脚本,可以修改特定exe /线程的日期时间 - 虽然这听起来几乎是不可能或极具危险性的!看起来我必须进一步研究虚拟服务器选项..... 我想是时候使用EC2了 :-) - Alex KeySmith
1
@AlexKey 没问题,很高兴能帮忙。Powershell 有一个 Set-Date 命令 (http://technet.microsoft.com/en-us/library/ee176960.aspx),但它会更改您的操作系统日期和时间。 - user596075

3
您可以随时使用此功能,并根据需要进行调整:
SELECT getutcdate()

请看下面的信息 StackOverflow 问题
但是,没有办法在不更改服务器日期的情况下更改 GETDATE() 的结果。
添加: 如果您愿意,您可以使用 EXEC xp_cmdshell 'DATE 10/10/2011',但这并不被建议。

嗨,感谢回复,但不幸的是这不是为了调整特定的GETDATE()调用,而是所有对GETDATE()的调用,以便我们可以测试现有代码。为了使测试更加稳健,我们尝试不更改代码,而是调整环境。无论如何感谢您。 - Alex KeySmith
抱歉,看起来你的SQL问题无解。 :) - SQLMason
关于xp_cmdshell的有趣观点,谢谢。我不认为它在我们的演示环境中启用了,但我会记住这个命令行的,谢谢。我给你点赞 :-) - Alex KeySmith

3

正如其他人所说,不行。

一种非常粗暴的解决方法是编写自己的函数来返回所需的日期,并在测试完成后返回GETDATE(),然后调用该函数。这样做可能会有一些轻微的开销,但它可以满足您的需求。


有趣的观点(+1),让我想到是否有一种覆盖GETDATE()的方法......看起来我可以使用完整语法dbo.GETDATE(),这确实意味着改变我的代码......但不会太糟糕,然而我正在运行一个2005 DB,在2000兼容模式下,所以关于确定性/非确定性函数等问题,我可能会遇到麻烦。https://dev59.com/mnE85IYBdhLWcg3w1HGF - Alex KeySmith
2
为了所有神圣的事情,请不要将您的新函数命名为getdate。我想不出比占用内置函数名称更容易产生混淆的方法了。如果您已经在更改代码库以适应新函数,请明确它正在执行其他操作。甚至,MYGETDATE会更好。 - Ben Thul

2

我曾经使用的另一种解决方法是,在任何插入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()值插入的列。)

好主意,我现在处于不同的世界,所以无法使用它,但我喜欢这个理论!我给你点赞。 - Alex KeySmith

0

谢谢Chris,我正在尝试避免改变我的代码,但与Doozer的答案类似http://stackoverflow.com/q/8246648/141022,来回切换可能是一个选择。感谢您的意见。 - Alex KeySmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接