【问题标题】:SQL Server GetDate function to return a future dateSQL Server GetDate 函数返回未来日期
【发布时间】:2016-02-12 20:49:02
【问题描述】:

这是一个现有的应用程序,有大约 1400 个存储过程,是多年前构建的。我们已经使用 GetDate() 来获取许多存储过程中的当前日期。

现在我们想用“老化”场景测试这个应用程序。我们的 DBA 告诉我们 GetDate() 函数从操作系统派生日期。因此,如果我们需要 getdate() 来返回未来日期,我们需要更改操作系统日期。数据中心的人不会让我们更改操作系统日期。

一个明显的解决方案是创建一个单独的 GetApplicationDate() 函数,该函数返回我们想要的任何日期,并查看所有存储过程并使用这个新的自定义函数更新它们。

我想避免更改 ~1400 个存储过程并覆盖 SQL Server 提供的 GetDate() 函数。这可能吗?

谢谢, 加亚

【问题讨论】:

  • 您的 DBA 是对的。找人取代“数据中心的人”,为您节省数小时的工作时间。但是,请记住操作系统日期是本地日期 - 因此,如果您在西方成本(或印度)或任何地方,未来的时间可能就像本地化更改一样简单。
  • 没有。 GetDate 返回当前系统日期时间。它是 sql server 中的本机代码,因此您无法更改它。对于此类测试,您必须更改当前系统时间。
  • 同意前 2 个 cmets。如果您不需要进行手术并且可以用您的自定义函数替换每次出现的 GETDATE(),那么可以使用复制/替换工具或更新系统表来快速完成。
  • @Hogan DBA总是是对的! ;-)
  • @JoeStefanelli - 在 IT Poker 中,DBA 的排名超过了数据中心专家。

标签: sql-server getdate


【解决方案1】:

Changing the output of Getdate 这里有一个类似的问题,它几乎指出除了更改 o/s 时间之外,无法更改 getdate 返回值。您可以考虑通过将 getdate 语句替换为包装器或日期时间提供程序来修改所有存储的过程,您可以在其中控制它返回的值、偏移量等。这可以通过将日期或偏移量放在包装器引用的表中来控制,这样您只需在一个地方进行更改。

如果这是一项大型作业(由于需要更改的对象数量),您可以考虑的另一件事是以编程方式(自动)对所有对象进行更改。谷歌上有很多关于如何做到这一点的点击。

【讨论】:

    【解决方案2】:

    看起来你终于到了没有机会不重构源代码的地步了。此外,我认为<date> 必须是您的存储过程的参数。
    可能你有一些理由在整个系统中类似地在 sp 中获取日期,在这种情况下,更改对新函数的引用看起来很合理。

    为避免“手动”修改每个 sp,您可以通过运行硬盘驱动器上的文件并将 getgate() 替换为新 func 名称的 regexp 脚本对其进行修改。如果将 sql-code 存储在 vcs 中。或者通过 t-sql 脚本使用 sys.sql_modules->definition 数据。这意味着您可以通过编程方式生成新的 sp 内容。但你必须小心。

    你也应该记住

    • 您的存储过程中的某处可能仍需要当前日期
    • 更改新函数返回的日期可能会导致性能问题
    • 新函数必须是确定性的,否则会导致额外的性能问题

    【讨论】:

      猜你喜欢
      • 2014-12-02
      • 2018-04-07
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多