替换特定字段中的不正确日期

时间:2015-02-10 20:50:54

标签: sql postgresql sql-update

我有一张桌子notes。在它,一个日期不知何故变得腐败,我需要修复它。当我进行查询以查找它时,我可以将特定实例与其他数据隔离,但不确定我认为答案是否会使其更糟糕。

以下是我用于验证特定实例的数据:

date_service   "20104-02-17 00:00:00" -- as you can see the year is wrong
date_creation  "2014-02-17 10:12:59.951"
zrud_client    "A6150528-4192-4894-8C2D-251C886B0093"
zzud_note      "77660C9E-4672-4864-A9E0-D32A60757E2C"

我想我可以通过使用以下内容来纠正它。这有用吗?

UPDATE TABLE notes
SET date_service = replace (date_service, '20104-02-17 00:00:00', '2014-02-17 10:12:59.951')

1 个答案:

答案 0 :(得分:3)

您提出的解决方案可能有效,但绝对不是解决此问题的方法。

它将做的是通过表格中的每一行,获取其date_service列,运行一些字符串操作,然后将值保存回来。显然,如果只有一个(或少数几个)日期需要修复,这是非常低效的。

使用SQL思考的方法首先是,您要查看哪些行,其次,您希望用它们做什么。

如果只有那个特定的损坏字符串,选择行很容易阅读:WHERE date_service = '20104-02-17 00:00:00'。由于我们特定的是行,所以做什么也很容易:SET date_service = '2014-02-17 00:00:00'。所以整个陈述是:

UPDATE notes
SET date_service =  '2014-02-17 00:00:00'
WHERE date_service =  '20104-02-17 00:00:00'

这也允许我们通过选择具有相似日期值的行来查看我们是否可以同时修复其他错误值。如何执行此操作取决于您的日期是仅存储为字符串还是timestamp列类型。如果它们只是字符串,你可以像这样做前缀匹配:

SELECT * 
FROM notes
WHERE date_service LIKE '20104-%'

如果它是时间戳列,您需要在将来查找日期,例如:

SELECT * 
FROM notes
WHERE date_service > '20100-01-01 00:00'

一旦你获得正确的WHERE子句,并且可以看到你的目标是正确的行,你可以使用它来编写更一般的更新,使用比你问题中更常规的替换,例如。

UPDATE notes
SET date_service = replace(date_service, '20104-', '2014-')
WHERE date_service LIKE '20104-%'