如何只更新MySQL中DATETIME字段的小时?

M.A*_*pon 14 mysql sql datetime hour date-manipulation

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

例如:

*************************************************
**        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 **
*************************************************
Run Code Online (Sandbox Code Playgroud)

想要在不使用任何编程语言的情况下使用MySQL查询.

Ste*_*ers 13

SQL

UPDATE datetimes
SET datetime = DATE_ADD(datetime,
                        INTERVAL (15 - HOUR(datetime)) HOUR);
Run Code Online (Sandbox Code Playgroud)

演示

http://rextester.com/JOJWJ94999

说明

DATE_ADD(datetime, INTERVALintervalHOUR)增加或减去间隔小时数datetime(取决于区间是正还是负).通过从15减去部分datetime(找到HOUR(datetime))的小时数来计算加或减的小时数.如果当前时间是16:00或之后,这将是负数,如果当前时间是在15:00之前,这将是一个正数.没有WHERE子句,因此表中的所有行都将更新.

  • 我喜欢这个,但会把它写成`datetime + INTERVAL(15 - HOUR(datetime))HOUR`. (4认同)

Pau*_*gel 13

你可以使用DATE_FORMAT()函数和"硬编码"小时:

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

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

如果要在预准备语句中将小时作为参数绑定,可以将其与REPLACE()以下内容组合:

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

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


Ivo*_*o P 6

看起来像MySQL DATETIME - 只更改日期

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

其中7表示此记录的datetime列所需的新小时数