Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 替换特定字段中不正确的日期_Sql_Postgresql_Sql Update - Fatal编程技术网

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并更新它将是一个更好的习惯。