簡體   English   中英

在包含記錄的現有表中,如何創建一個新的 datetime2(2) 列並使用基於另一列的值填充它?

[英]In an existing table with records, how do I create a new datetime2(2) column and populate it with values based on another column?

我有一個看起來像這樣的 VARCHAR 列:

Created_DTM
-----------
2020-02-05 16:26:45.00Z
2020-02-16 08:55:52.00Z
2020-04-24 15:24:01.00Z
2020-06-13 22:14:18.00Z

如何編寫一個腳本來創建一個名為 Created_DTM_Converted 的新列,並用一個值填充每條記錄,以便 zulu (Z) 字符消失,同時減去 5 小時以匹配我的時區?

我試過的:

此查詢為我提供了我需要的確切值:

SELECT dateadd(hh, -5, convert(datetime2(2), Created_DTM, 120)) AS Created_DTM_Converted
FROM dbo.table

這是 output:

Created_DTM_Converted
-----------
2020-02-05 11:26:45.00
2020-02-16 03:55:52.00
2020-04-24 10:24:01.00
2020-06-13 17:14:18.00

但我不知道如何編寫一個可以執行一次的腳本,並將使其成為永久添加的列。 我該怎么做? go

您可以更改表並將此新列添加為計算列:

ALTER TABLE dbo.table
ADD COLUMN Created_DTM_Converted AS DATEADD(hh, -5, CONVERT(datetime2(2), Created_DTM, 120));

請注意,上面的計算列是虛擬的,這意味着它實際上並未存儲在數據庫中,而是在訪問時動態計算。

順便說一句,減去 5 小時的一種可能更簡單的方法可能是取時間戳的前 22 個字符:

SELECT DATEADD(hh, -5, LEFT(Created_DTM, 22))
FROM dbo.table;

這似乎也有效。

編輯:

出於幾個原因,我建議不要刪除原始Created_DTM列。 首先,它代表原始源數據,通常最好保留盡可能多的 state。 其次,假設新記錄將以這種原始格式插入,那么您需要維護此列。 在這種情況下,在您的桌子上構建某種視圖是合適的。

由於您在評論中提到您打算從舊列計算新列,並打算稍后刪除舊列,因此您將無法使用 Tim 的計算列答案。

因此,您需要分兩步執行此過程。 首先添加列,然后用值填充它。 您可以稍后作為第三步刪除原始列。

alter table dbo.table add Created_DTM_Converted datetime2(2) null;
go

update dbo.table
set    Created_DTM_Converted = dateadd(hh, -5, convert(datetime2(2), Created_DTM, 120));

填充列后,您可以選擇更改其定義以不允許空值:

alter table dbo.table alter column Created_DTM_Converted datetime2(2) not null;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM