MySQL从午夜减去hh:mm:ss的时间

时间:2014-11-28 00:16:40

标签: mysql date datetime

我在MySQL中有一个时间戳," date_taken"它有yyyy-mm-dd hh:mm:ss格式。我希望在午夜(00:00:00)和date_taken之间得到hh:mm:ss格式的时差。

例如:if" date_taken"是2014-11-28 16:30:30,我想从午夜07:30:30获得差异。

我使用了以下内容:

SELECT TIMESTAMPDIFF(HOUR, '00:00:00',date('H:i:s', strtotime('date_taken'))) * FROM `table`

当然似乎没有用。我是MySQL的初学者,所以请耐心等待。

此外,这种差异将在我的网站上用作反向计数器。

3 个答案:

答案 0 :(得分:2)

有点麻烦,但它有效:

set @ft = now() -- Just for testing
select @ft
     , timediff(cast(date_add(date(@ft), interval +1 day) as datetime), @ft);

结果:

+---------------------+-----------------------------------------------------------------------+
| @ft                 | timediff(cast(date_add(date(@ft), interval +1 day) as datetime), @ft) |
+---------------------+-----------------------------------------------------------------------+
| 2014-11-27 18:35:33 | 05:24:27                                                              |
+---------------------+-----------------------------------------------------------------------+

解释:

  • @ft:只是一个测试变量。用你想要的字段替换它
  • date_add(date(@ft), interval +1 day):将值截断为日期(即删除时间部分)并添加一天
  • cast(date_add(date(@ft), interval +1 day) as datetime)将新日期作为日期时间投放(例如:使用提供的值,cast(date_add(date(@ft), interval +1 day) as datetime)将为2014-11-28 00:00:00
  • 最后,timediff()只计算输入值与新日期时间之间的差异

希望这有帮助


卫生署!!!!一个更简单的解决方案:

set @ft = now() -- Just for testing
select @ft, timediff('24:00:00', time(@ft));

结果:

+---------------------+---------------------------------+
| @ft                 | timediff('24:00:00', time(@ft)) |
+---------------------+---------------------------------+
| 2014-11-27 18:35:33 | 05:24:27                        |
+---------------------+---------------------------------+

用您期望的值/字段<{1}}替换@ft中的select

(我认为不需要解释;))

答案 1 :(得分:1)

SELECT TIMEDIFF('24:00:00','07:30:30');
+---------------------------------+
| TIMEDIFF('24:00:00','07:30:30') |
+---------------------------------+
| 16:29:30                        |
+---------------------------------+

SELECT TIMEDIFF('24:00:00','16:30:00');
+---------------------------------+
| TIMEDIFF('24:00:00','16:30:00') |
+---------------------------------+
| 07:30:00                        |
+---------------------------------+

所以,一个有效的例子......

 SELECT * FROM users;
 +-----+---------+---------------------+
 | uid | Version | install_time        |
 +-----+---------+---------------------+
 |   1 |       1 | 2014-11-28 04:38:41 |
 |   1 |       2 | 2014-11-28 14:50:27 |
 |   1 |       3 | 2014-11-28 17:15:05 |
 |   2 |       3 | 2014-11-28 16:07:34 |
 |   3 |       2 | 2014-11-28 12:50:42 |
 |   4 |       4 | 2014-11-28 00:55:37 |
 +-----+---------+---------------------+

 SELECT TIMEDIFF('24:00:00',TIME(install_time))x FROM users;
 +----------+
 | x        |
 +----------+
 | 19:21:19 |
 | 09:09:33 |
 | 06:44:55 |
 | 07:52:26 |
 | 11:09:18 |
 | 23:04:23 |
 +----------+

答案 2 :(得分:1)

您可以尝试使用SUBTIME减去时间,使用DATE_FORMAT设置每个日期的格式。

e.g:

  SELECT SUBTIME('2007-12-31 23:59:59.999999','1 1:1:1.000002');
    -> '2007-12-30 22:58:58.999997'

  SELECT SUBTIME(DATE_FORMAT('date_taken', '%Y-%d-%m %H:%i:%s'),DATE_FORMAT('date_taken', '%Y-%d-%m'));

(未测试的)

那应该从同一天的午夜减去一个完整的yyyy-mm-dd hh:mm:ss日期。

date()和strtotime()不是MySQL函数 - 它们是php函数。您可以在mysql查询中使用UNIX_TIMESTAMP而不是strtotime(),但您需要确保时区相同。