【问题标题】:How to update only the hour from a DATETIME field in MySQL?如何仅从 MySQL 中的 DATETIME 字段更新小时?
【发布时间】:2017-07-04 06:32:17
【问题描述】:

我想更新一个 DateTime 列,它只会更改时间而不修改其他任何内容。我不能用来添加间隔,因为值都不同。也有许多不同的日期。因此需要将确切所需日期的时间更改为 where 条件。

例如:

*************************************************
**        Before       *|*         After       **
************************|************************
** 2017-07-24 19:06:15 *|* 2017-07-24 15:06:15 **
** 2017-07-24 17:12:23 *|* 2017-07-24 15:12:23 **
** 2017-07-24 23:00:03 *|* 2017-07-24 15:00:03 **
** 2017-07-24 20:33:56 *|* 2017-07-24 15:33:56 **
** 2017-07-24 18:19:31 *|* 2017-07-24 15:19:31 **
** 2017-07-24 16:43:47 *|* 2017-07-24 15:43:47 **
*************************************************

希望只使用 MySQL 查询而不使用任何编程语言。

【问题讨论】:

  • 新的一小时从何而来?
  • @Barmar 它可能来自参数。很高兴看看他到目前为止尝试了什么 sql
  • 使用字符串连接将新的小时合并为一个格式字符串,您可以与DATE_FORMAT()一起使用。
  • 如果要直接更新数据,只需使用子字符串即可。如果您总是为小时指定一个两位数的值,这将起作用。例如更新 schema_name.table_name set substring(date_field,12,2)=new_hour where date_field=where_condition。如果这是您要找的,请现在告诉我,我会添加答案

标签: mysql sql datetime hour date-manipulation


【解决方案1】:

您可以使用DATE_FORMAT() 函数并“硬编码”小时:

UPDATE some_table SET dt = DATE_FORMAT(dt, '%Y-%m-%d 15:%i:%s');

演示:http://rextester.com/RJESF70894

如果你想在准备好的语句中绑定小时作为参数,你可以将它与REPLACE()结合起来:

UPDATE some_table SET dt = DATE_FORMAT(dt, REPLACE('%Y-%m-%d %H:%i:%s', '%H', ?))

演示:http://rextester.com/OHUKF73552

【讨论】:

    【解决方案2】:

    SQL

    UPDATE datetimes
    SET datetime = DATE_ADD(datetime,
                            INTERVAL (15 - HOUR(datetime)) HOUR);
    

    演示

    http://rextester.com/JOJWJ94999

    说明

    DATE_ADD(datetime, INTERVAL间隔HOUR)datetime中增加或减少间隔小时(取决于interval 是正数还是负数)。加减小时数的计算方法是用 15 减去 datetime(来自 HOUR(datetime))的小时数部分。如果当前时间是 16:00 或之后,这将是负数,如果当前时间在 15:00 之前,它将是一个正数。没有WHERE 子句,因此表中的所有行都会更新。

    【讨论】:

    • 我喜欢这个,但会写成datetime + INTERVAL (15 - HOUR(datetime)) HOUR
    • 同意 - 添加了额外的括号。
    【解决方案3】:

    看起来像MySQL DATETIME - Change only the date

    UPDATE tabelname 
    SET colname = CONCAT(DATE(colname), ' ', 7, DATE_FORMAT(colname, ':%i:%s')) 
    WHERE id = 123;
    

    其中 7 代表您希望此记录的日期时间列的新小时

    【讨论】:

    • #1305 - FUNCTION DATE_FOMAT 不存在
    • R 缺失:DATE_FORMAT
    • #1582 - 调用本机函数“DATE_FORMAT”时的参数计数不正确
    • colname 也应该被提及。 (现在还早:-))
    • 它将分钟和秒更改为 00:00。我想让它们保持不变。
    【解决方案4】:

    您可以使用以下查询,希望对您有所帮助:

    UPDATE tablename SET colname = DATE_FORMAT(STR_TO_DATE(colname, '%Y-%m-%d %H:%i:%s'), '%Y-%m-%d 15:%i:%s');
    

    在此查询中,15 代表您想要记录的新小时

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 2012-11-23
      • 2012-02-20
      • 1970-01-01
      • 2017-09-19
      • 2015-03-22
      • 2011-03-09
      相关资源
      最近更新 更多