Sql 替换特定字段中不正确的日期
我有一张表Sql 替换特定字段中不正确的日期,sql,postgresql,sql-update,Sql,Postgresql,Sql Update,我有一张表注释。在它里面,一个日期不知何故被破坏了,我需要修复它。当我进行查询以找到它时,我可以将特定实例与其他数据隔离开来,但不确定我认为答案是否会更糟 以下是我用来验证特定实例的数据: 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-
注释。在它里面,一个日期不知何故被破坏了,我需要修复它。当我进行查询以找到它时,我可以将特定实例与其他数据隔离开来,但不确定我认为答案是否会更糟
以下是我用来验证特定实例的数据:
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')
您提出的解决方案可能有效,但它肯定不是解决此问题的方法
它要做的是遍历表中的每一行,获取其date\u服务
列,运行一些字符串操作,然后保存回值。显然,如果只有一个(或几个)日期需要确定,这是非常低效的
使用SQL的思考方式是,首先,您希望查看哪些行,其次,您希望如何处理它们
如果只有特定的损坏字符串,则选择行很容易,也很容易阅读:WHERE date\u service='20104-02-17 00:00:00'
。由于我们对行进行了特定处理,所以要做的事情也很简单:SET date\u 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'
这还允许我们通过选择具有类似日期值的行,查看是否有其他错误值可以同时修复。如何做到这一点取决于您的日期是存储为字符串还是存储为时间戳
列类型。如果它们只是字符串,可以进行如下前缀匹配:
SELECT *
FROM notes
WHERE date_service LIKE '20104-%'
SELECT *
FROM notes
WHERE date_service > '20100-01-01 00:00'
如果它是一个时间戳列,您需要在将来查找日期,如下所示:
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-%'
我认为在where子句中添加其他信息会更安全,以确保只更新一条记录。我认为计划是将其设置为'2014-02-17 10:12:59.951'
。严格地说,将WHERE
条件建立在PK的基础上可能更好,但在这样的情况下,这并不重要,因此,d'accord否则。@ErwinBrandstetter啊,是的,我错过了。无论如何,我都会提出一个更一般的查询,并点击save,以防我弄糟了什么东西或者更快的打字机追上了我。如果只有一行需要更新,那么是的,找到PK并更新它将是一个更好的习惯。