![](/img/trans.png)
[英]How do I create a new column that is based on multiple values in another column?
[英]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.