在MySQL中添加和子时间

时间:2016-01-13 10:23:49

标签: mysql datetime

在MySQL表中,我有这些值00:00:0006:00:00

我需要在00:00:00上退三小时,返回21:00:00并在06:00:00上添加三小时,然后返回09:00:00

我尝试过这个SQL查询,但没有成功。

请帮帮我,谢谢你。

mysql> SELECT
    SUBTIME('00:00:00', 3),
    ADDTIME('06:00:00', 3);
+------------------------+------------------------+
| SUBTIME('00:00:00', 3) | ADDTIME('06:00:00', 3) |
+------------------------+------------------------+
| -00:00:03              | 06:00:03               |
+------------------------+------------------------+
1 row in set

mysql> 

#Edit 1

mysql> SELECT
    '00:00:00' - INTERVAL 3 HOUR,
    '06:00:00' + INTERVAL 3 HOUR;
+------------------------------+------------------------------+
| '00:00:00' - INTERVAL 3 HOUR | '06:00:00' + INTERVAL 3 HOUR |
+------------------------------+------------------------------+
| NULL                         | NULL                         |
+------------------------------+------------------------------+
1 row in set

mysql> 

#Edit 2

mysql> SELECT
    DATE_ADD('00:00:00', INTERVAL 3 HOUR),
    DATE_ADD('06:00:00', INTERVAL 3 HOUR);

SELECT
    SUBTIME('00:00:00', '03:00:00'),
    ADDTIME('06:00:00', '03:00:00');
+---------------------------------------+---------------------------------------+
| DATE_ADD('00:00:00', INTERVAL 3 HOUR) | DATE_ADD('06:00:00', INTERVAL 3 HOUR) |
+---------------------------------------+---------------------------------------+
| NULL                                  | NULL                                  |
+---------------------------------------+---------------------------------------+
1 row in set

+---------------------------------+---------------------------------+
| SUBTIME('00:00:00', '03:00:00') | ADDTIME('06:00:00', '03:00:00') |
+---------------------------------+---------------------------------+
| -03:00:00                       | 09:00:00                        |
+---------------------------------+---------------------------------+
1 row in set

mysql> 

2 个答案:

答案 0 :(得分:0)

应该是

SELECT
    TIME(SUBTIME(CONCAT(curdate(),' ','00:00:00'), 03:00:00)),
    TIME(ADDTIME(CONCAT(curdate(),' ','00:00:00'), 03:00:00));

答案 1 :(得分:0)

由于实际上没有时间像' -00:00:03',你无法应用时间操作来做这件事。

如果你真的需要这个,我建议你

  1. 将列更改为INT类型,然后自行执行操作。
  2. 将列更改为DATETIME类型,并尝试自行处理跨日问题。
  3. 或者应用以下内容......

    SELECT CONCAT(
      TIMESTAMPDIFF(
        HOUR,
        STR_TO_DATE(CONCAT('2015/01/01 ', '00:00:00'), '%Y/%m/%d %H:%i:%s'),
        STR_TO_DATE(CONCAT('2015/01/01 ', '00:00:00'), '%Y/%m/%d %H:%i:%s') - interval 3 hour
      ) % 24,
      ":",
      TIMESTAMPDIFF(
        MINUTE,
        STR_TO_DATE(CONCAT('2015/01/01 ', '00:00:00'), '%Y/%m/%d %H:%i:%s'),
        STR_TO_DATE(CONCAT('2015/01/01 ', '00:00:00'), '%Y/%m/%d %H:%i:%s') - interval 3 hour
      ) % 60,
      ":",
      TIMESTAMPDIFF(
        SECOND,
        STR_TO_DATE(CONCAT('2015/01/01 ', '00:00:00'), '%Y/%m/%d %H:%i:%s'),
        STR_TO_DATE(CONCAT('2015/01/01 ', '00:00:00'), '%Y/%m/%d %H:%i:%s') - interval 3 hour
      ) % 60
    );
    

    只需将'00:00:00'3 hour替换为您想要的任何内容。

  4. 它只是尝试将时间连接到日期时间字符串,并将其转换为datetime然后应用间隔操作。之后,它应用timediff来计算给定单位的经过时间(不要忘记%以获得正确的域)。最后连接三个不同之处。

    这个答案有点难看,希望对你有帮助。