Sql-Server

在整個數據庫中更改 GETDATE() 的使用

  • January 24, 2019

我需要將本地 SQL Server 2017 數據庫遷移到 Azure SQL 數據庫,我面臨著一些挑戰,因為有很多限制要通過。

特別是,由於 Azure SQL 數據庫僅在 UTC 時間(無時區)中工作並且我們需要本地時間,因此我們必須更改數據庫中GETDATE() 任何地方的使用,這已證明比我預期的要多。

我創建了一個使用者定義的函式來獲取適用於我的時區的本地時間:

CREATE FUNCTION [dbo].[getlocaldate]()
RETURNS datetime
AS
BEGIN
   DECLARE @D datetimeoffset;
   SET @D = CONVERT(datetimeoffset, SYSDATETIMEOFFSET()) AT TIME ZONE 'Pacific SA Standard Time';
   RETURN(CONVERT(datetime,@D));
END

我遇到的問題是GETDATE()在每個視圖、儲存過程、計算列、預設值、其他約束等中實際更改此函式。

實施此更改的最佳方式是什麼?

我們處於託管實例的公共預覽版中。它仍然有同樣的問題GETDATE(),所以它對這個問題沒有幫助。遷移到 Azure 是一項要求。這個數據庫總是在這個時區使用(並將被使用)。

  1. 使用 SQL Server 工具將數據庫對象定義導出到 SQL 文件,其中應包括:表、視圖、觸發器、SP、函式等
  2. 使用任何允許您查找文本"GETDATE()"並將其替換為的文本編輯器編輯 SQL 文件(首先進行備份)"[dbo].[getlocaldate]()"
  3. 在 Azure SQL 中執行已編輯的 SQL 文件以創建數據庫對象…
  4. 執行數據遷移。

在這裡您可以參考 azure 文件:Generating Scripts for SQL Azure

實施此更改的最佳方式是什麼?

我會反過來工作。將數據庫中的所有時間戳轉換為 UTC,然後使用 UTC 並順其自然。如果您需要不同 tz 中的時間戳,您可以使用AT TIME ZONE(如上面所做的那樣)創建一個生成的列,該列在指定的 TZ 中呈現時間戳(對於應用程序)。但是,我會認真考慮讓 UTC 返回應用程序,並在應用程序中編寫該邏輯 - 顯示邏輯。

引用自:https://dba.stackexchange.com/questions/211352