【问题标题】:Update MySQL column based on another column's data根据另一列的数据更新 MySQL 列
【发布时间】:2015-09-29 15:52:54
【问题描述】:

我有一个名为TICKET 的表。在工单的列中有两个日期字段:

TICKET
----------------------------------------
TICKDATE             | ELSDATE     | ...
---------------------+-------------+----
yyyy-mm-dd hh:mm:ss    yyyy-mm-dd

这两个日期应该始终相同。

我有一个日期范围(从 7 月 1 日到当前),其中 ELSDATE 为空。我刚开始使用 sql 脚本,我不知道如何更新一列以等于另一列。我正在运行以一次更新的当前脚本是:

update TICKET ELSDATE="yyyy-mm-dd" where date(TICKDATE)="yyyy-mm-dd"

我想我可以做这样的事情:

update TICKET where ELSDATE="???" date(TICKDATE)<date("2015-09-29")

【问题讨论】:

  • 如果它们应该始终相同,您为什么不直接删除该列?它占用空间,没有给你任何好处。
  • @Sumurai8 TICKDATE 和 ELSDATE 是从远程站点的两个应用程序写入的。 TICKDATE 由现场和远程监控应用程序读取。 ELSDATE 由我们的商业智能基础设施轮询。这是非常愚蠢的,但它是公认的愚蠢,很难改变。

标签: mysql sql-update


【解决方案1】:

如果要将 ELSDATE 的每个值设置为 TICKDATE 在 2015 年 9 月 29 日之前所在的同一行中的值,请使用:

UPDATE TICKET SET ELSDATE = TICKDATE where TICKDATE < "2015-09-29"

【讨论】:

  • 这不能使用TICKDATE上的任何索引。我建议TICKDATE &lt; "2015-09-29"
  • @Arth 你能解释一下吗?我不确定那是什么意思。
  • 如果列TICKDATE有索引,直接比较它的查询可以使用索引找到匹配比较的行。这在性能方面比访问每一行以查找匹配的行更可取。
【解决方案2】:

是的:

UPDATE TICKET 
   SET ELSDATE = TICKDATE 
 WHERE TICKDATE < CURDATE() /* AND ELSDATE IS NULL */

【讨论】:

    【解决方案3】:

    您可以在一个查询中完成所有更新,这样您就不必每天都进行更新。该查询会将每一行 ELSDATE 更改为等于 TICKDATE

    UPDATE TICKET SET ELSDATE = TICKDATE;
    

    要仅更新 ELSEDATE 为空的行,您可以使用。

    UPDATE TICKET SET ELSDATE = TICKDATE WHERE ELSDATE IS NULL;
    

    要在两个日期之间更改行,请使用 BETWEEN 子句。

    UPDATE TICKET SET ELSDATE = TICKDATE WHERE TICKDATE BETWEEN '2015-07-01' AND CURDATE();
    

    【讨论】:

    • 最后一个语句会包含CURDATE()吗?重要的是 ELSDATE 仍然是 null 从今天的数据。
    • @AdamSmith 会的。如果您不想这样做,请使用此 Where 子句:...WHERE TICKDATE &gt; '2015-07-01' AND TICKDATE &lt; CURDATE();。这将从查询中排除 CURDATE()。
    • @C4ud3x 感谢您的澄清!在这种情况下,我可以更新所有比今天更早的行,所以我根本不用担心。也就是说,很高兴知道我有什么选择!
    • 你最后的更新是错误的,BETWEEN 会将CURDATE() 转换成TIMESTAMP/DATETIME 以便与TICKDATE 进行比较(实际上是附加00:00:00)。您最好使用&gt;=&lt; 的两个条件。出于这个原因,我个人从不使用BETWEEN 进行日期/时间比较。
    • @Arth,我错了。感谢您指出。编辑我的帖子。
    猜你喜欢
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 2016-06-24
    • 2017-07-24
    相关资源
    最近更新 更多