![](/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.