【问题标题】:Simulate current date on a SQL Server instance?在 SQL Server 实例上模拟当前日期?
【发布时间】:2012-01-05 00:02:37
【问题描述】:

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

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

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

它必须在半生产(暂存)环境中,所以很遗憾,更改操作系统日期/时间不是我们的选择。

在理想情况下,我们会启动虚拟服务器,但目前也不是真正的选择。

【问题讨论】:

  • @loudmmummer 我认为你是对的,他们似乎是同一个问题,我当时没有遇到这个问题。这两个问题(很老)都吸引了宝贵的见解,是否可以合并它们?
  • 确实,这两个问题都有很好的答案。可以合并它们,但this 帖子说只有版主才能做到。也许您可以标记它以引起版主注意?

标签: sql-server getdate


【解决方案1】:

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

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

【讨论】:

  • 感谢 Shark,我 +1。我希望有某种神奇的解决方法...... :-) 我想知道是否有任何硬编码的 powershell 脚本可以更改特定 exe / 线程的日期时间 - 尽管这听起来几乎不可能 / v 危险!看起来我必须进一步研究虚拟服务器选项.....我认为 EC2 的时间:-)
  • @AlexKey 没问题,很高兴为您提供帮助。有一个用于 Powershell (technet.microsoft.com/en-us/library/ee176960.aspx) 的 Set-Date cmdlet,但它会改变您的操作系统日期和时间。
【解决方案2】:

您可以随时使用它并进行相应调整:

SELECT getutcdate()

请参阅下文了解更多信息 StackOverflow Question

但是,如果不更改服务器的日期,则无法更改 GETDATE() 的结果。


添加: 如果你愿意,你可以做一个EXEC xp_cmdshell 'DATE 10/10/2011'...但不建议这样做。

【讨论】:

  • 您好,感谢您的回复,但不幸的是,这不是为了调整对 GETDATE() 的特定调用,而是调整对 GETDATE() 的所有调用,以便我们可以测试现有代码。为了使测试更加健壮,我们尝试不更改代码,而是调整环境。还是谢谢。
  • 抱歉,您的 SQL 问题似乎是 SOL。 :)
  • 关于 xp_cmdshell 的有趣点谢谢。我不认为它在我们的暂存环境中启用,但我会记住 cmd 行,谢谢。来自我的 +1 :-)
【解决方案3】:

正如其他人所说,没有。

一个非常老套的解决方法是编写自己的函数来返回您想要的日期,并在您完成测试时让它返回 GETDATE(),然后调用该函数。这样做可能会有一些开销,但它会满足您的需求。

【讨论】:

  • 有趣的一点(我+1),让我想到是否有一种方法可以覆盖 GETDATE()... 看起来我可以使用完整的语法 dbo.GETDATE() 它确实意味着更改我的代码......但不会太糟糕,但是我在 2000 兼容模式下在 2005 DB 上运行,所以我可能会在确定性/非确定性函数等方面遇到麻烦stackoverflow.com/questions/2593047/…跨度>
  • 为了所有神圣的爱,请不要调用你的新函数getdate。我想不出比为自己的目的选择内置函数的名称更容易产生混淆的方法。如果您已经在更改代码库以适应您的新功能,请明确表明它正在做其他事情。见鬼,MYGETDATE 会更好。
【解决方案4】:

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

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

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

Bind a column default value to a function in SQL 2005

【讨论】:

  • 谢谢克里斯,我试图避免更改我的代码,但类似于 Doozer 的回答 stackoverflow.com/q/8246648/141022 它可能是一个来回切换的选项。感谢您的意见。
【解决方案5】:

我取得了一些成功的另一种解决方法是将 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() 值插入的那些。)

【讨论】:

  • 好主意,我现在在另一个世界,所以不会使用它,但我喜欢这个理论!来自我的 +1。
猜你喜欢
  • 2011-05-25
  • 1970-01-01
  • 2018-12-30
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2021-09-23
相关资源
最近更新 更多