Sql-Server
在整個數據庫中更改 GETDATE() 的使用
我需要將本地 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 是一項要求。這個數據庫總是在這個時區使用(並將被使用)。
- 使用 SQL Server 工具將數據庫對象定義導出到 SQL 文件,其中應包括:表、視圖、觸發器、SP、函式等
- 使用任何允許您查找文本
"GETDATE()"
並將其替換為的文本編輯器編輯 SQL 文件(首先進行備份)"[dbo].[getlocaldate]()"
- 在 Azure SQL 中執行已編輯的 SQL 文件以創建數據庫對象…
- 執行數據遷移。
在這裡您可以參考 azure 文件:Generating Scripts for SQL Azure
實施此更改的最佳方式是什麼?
我會反過來工作。將數據庫中的所有時間戳轉換為 UTC,然後使用 UTC 並順其自然。如果您需要不同 tz 中的時間戳,您可以使用
AT TIME ZONE
(如上面所做的那樣)創建一個生成的列,該列在指定的 TZ 中呈現時間戳(對於應用程序)。但是,我會認真考慮讓 UTC 返回應用程序,並在應用程序中編寫該邏輯 - 顯示邏輯。