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

时间:2016-12-14 12:06:54

标签: sql-server

我需要将数据从a列插入b列。

列A样本值:

CustomerDB_2016_12_12_203001_9284029
CustomerDB_2016-12_11_203005_8572784
CustomerDB_2016-12_10_203353_5347358

等等

B栏是空白

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

2016-12-12
2016-12-11
2016-12-10

等等

这可以在sql server中使用吗?

感谢。

1 个答案:

答案 0 :(得分:4)

update query可以执行此操作:

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

另一种方法是使用computed column

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')
;

两种方法都返回:

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

如果要保持两列同步,我建议使用计算列。否则请更新。

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

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

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

修改

尝试从另一个值中提取一个值通常非常棘手。在这种情况下,有几种不同的格式可以应对。

此更新查询使用一系列replace函数从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) 
;

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