在包含记录的现有 table 中,如何创建新的 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 的新列,并用一个值填充每条记录,以便祖鲁 (Z) 字符消失,同时减去 5 小时以匹配我的时区?
我试过的:
此查询为我提供了我需要的确切值:
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
但我不知道如何编写一个可以执行一次并使它成为永久添加列的脚本。我该怎么做?
您可以更改 table 并将此新列添加为计算列:
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
列。首先,它代表原始源数据,通常最好保持尽可能多的状态。其次,假设新记录将以这种原始格式插入,那么您可能希望维护此列。在这种情况下,在 table 之上构建某种视图是合适的。
由于您在评论中提到您打算从旧列计算新列,并打算稍后删除旧列,因此您将无法使用 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;
我有一个 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 的新列,并用一个值填充每条记录,以便祖鲁 (Z) 字符消失,同时减去 5 小时以匹配我的时区?
我试过的:
此查询为我提供了我需要的确切值:
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
但我不知道如何编写一个可以执行一次并使它成为永久添加列的脚本。我该怎么做?
您可以更改 table 并将此新列添加为计算列:
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
列。首先,它代表原始源数据,通常最好保持尽可能多的状态。其次,假设新记录将以这种原始格式插入,那么您可能希望维护此列。在这种情况下,在 table 之上构建某种视图是合适的。
由于您在评论中提到您打算从旧列计算新列,并打算稍后删除旧列,因此您将无法使用 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;