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

Sql server 将A列中的部分值插入同一表中的B列,sql-server,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派生) 等等 这在SQL server中可能吗 谢谢。您可以这样做: UPDATE YourTableName SET ColumnB = CAST(REPLACE(SUBS

我需要将数据从列a插入列B

A列样本值:

CustomerDB_2016_12_12_203001_9284029
CustomerDB_2016-12_11_203005_8572784
CustomerDB_2016-12_10_203353_5347358
等等

列B为空

我需要列B存储如下值(从列A派生)

等等

这在SQL server中可能吗

谢谢。

您可以这样做:

UPDATE
    YourTableName
SET
    ColumnB = CAST(REPLACE(SUBSTRING(ColumnA, 12, 10), '_', '-') AS DATE)
;
另一种方法是使用

两种方法都返回:

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
如果您想保持两列同步,我建议使用计算列。否则,请继续更新

我曾经显式地设置返回的数据类型

我习惯于重新格式化日期。YYYY-MM_DD变为YYYY-MM-DD。第二种格式可以直接从字符串转换为日期。第一个不能

我曾经从位置12开始提取10个字符

编辑

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

此更新查询使用一系列函数从ColumnA中删除CustomerDb、Backup、下划线和破折号。剩下的应该是一个以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) 
;

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

ColumnA的格式是否固定?日期总是从第12个字符开始到第21个字符结束吗?是的,它是固定的。12点开始,21点结束谢谢。使用更新查询时,从字符串转换日期和/或时间时,I ma getting Down error Msg 241,Level 16,State 1,Line 11转换失败。该错误告诉您某些记录不遵循固定格式。您可以通过运行以下查询来找到它们:
SELECT*FROM YouTableName,其中ISDATE(REPLACE(子字符串(ColumnA,12,10),“",“-”)=0
。此查询使用查找看起来不像日期的字符串。有些旧文件名类似于CustomerDB_2015_05_31_2300。如何从这些类型的文件名中获取日期。请建议。对不起,我应该在我的第一篇帖子中添加这个
CustomerDB_2015_05_31_2300
应该可以。日期部分仍然从字符12开始,然后持续10个字符。五月有31天。怀疑这不是给你带来麻烦的记录。对不起。有40个像CustomerDB_201501312300这样的文件名。我认为这些都在制造问题。如何修复这些问题?
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
-- 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) 
;