繁体   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