将 A 列中的部分值插入同一个表中的 B 列

Ame*_*lia 3 sql-server

我需要将数据从A插入到B 列

A 列示例值:

CustomerDB_2016_12_12_203001_9284029
CustomerDB_2016-12_11_203005_8572784
CustomerDB_2016-12_10_203353_5347358
Run Code Online (Sandbox Code Playgroud)

等等

B栏为空

我需要B 列来存储如下值(来自A 列

2016-12-12
2016-12-11
2016-12-10
Run Code Online (Sandbox Code Playgroud)

等等

这在 SQL Server 中可能吗?

谢谢。

des*_*ata 5

一个更新查询可以这样做:

UPDATE
    YourTableName
SET
    ColumnB = CAST(REPLACE(SUBSTRING(ColumnA, 12, 10), '_', '-') AS DATE)
;
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用计算列

DECLARE @Sample TABLE 
    (
        ColumnA VARCHAR(255),
        ColumnB AS CAST(REPLACE(SUBSTRING(ColumnA, 12, 10), '_', '-') AS DATE)
    )
;

INSERT INTO @Sample
    (
        ColumnA
    )
VALUES
    ('CustomerDB_2016_12_12_203001_9284029'),
    ('CustomerDB_2016-12_11_203005_8572784'),
    ('CustomerDB_2016-12_10_203353_5347358')
;
Run Code Online (Sandbox Code Playgroud)

两种方法都返回:

ColumnA                                 ColumnB
CustomerDB_2016_12_12_203001_9284029    2016-12-12
CustomerDB_2016-12_11_203005_8572784    2016-12-11
CustomerDB_2016-12_10_203353_5347358    2016-12-10
Run Code Online (Sandbox Code Playgroud)

如果您想保持两列同步,我建议使用计算列。否则继续更新。

我使用cast显式设置返回的数据类型。

我已经使用替换来重新格式化日期。YYYY-MM_DD 变为 YYYY-MM-DD。第二种格式可以直接从字符串转换为日期。第一个不能。

我使用substring从位置 12 开始提取 10 个字符。

编辑

试图从另一个值中提取一个值通常非常棘手。在这种情况下,有几种不同的格式需要处理。

此更新查询使用一系列替换函数从 ColumnA 中删除 CustomerDb、备份、下划线和破折号。剩下的应该是一个以 YYYYMMDD 开头的字符串。该值被提取并转换为日期。

-- Each replace strips away unrequired characters,
-- leaving us with a string in the format YYYYMMDD.
UPDATE
    @Sample
SET
    ColumnB = CAST(LEFT(REPLACE(REPLACE(REPLACE(REPLACE(ColumnA, 'CustomerDB', ''), '_', ''), '-', ''), 'BACKUP', ''), 8) AS DATE) 
;
Run Code Online (Sandbox Code Playgroud)

这个问题有更好的方法。但是,此解决方案更易于编辑和扩展。