sql—在一个包含记录的现有表中,如何创建一个新的datetime2(2)列并使用基于另一列的值填充它?

kjthegm6  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(270)

我有一个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\u dtm\u converted的新列,并用一个值填充每条记录,以便在减去5个小时以匹配我的时区时,zulu(z)字符消失?
我试过的:
此查询提供了所需的精确值:

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

这是输出:

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

但我不知道如何编写一个脚本,可以执行一次,并将此列永久添加。我该怎么做呢?

zaq34kh6

zaq34kh61#

由于您在评论中提到您打算从旧列计算新列,并打算稍后删除旧列,因此您将无法使用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;
7uzetpgm

7uzetpgm2#

您可以更改表并将此新列添加为计算列:

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 有几个原因。首先,它表示原始的源数据,通常最好尽可能多地保持状态。第二,假设新记录将以这种原始格式插入,那么您需要维护这个列。在这种情况下,在表的顶部构建某种视图是合适的。

相关问题