MySQL中两个日期之间的差异

217

如何在格式为YYYY-MM-DD hh:mm:ss的两个日期之间计算差异,并获得以秒或毫秒表示的结果?


19
注意:(end-start)不会返回日期时间值之间的秒差,它返回的是看起来像yyyymmddhhmmss的小数数字之间的差异。 - helloPiers
这回答了你的问题吗?如何以秒为单位获取两个时间戳之间的差异 - jdhao
14个回答

403
SELECT TIMEDIFF('2007-12-31 10:02:00','2007-12-30 12:01:01');
-- result: 22:00:59, the difference in HH:MM:SS format


SELECT TIMESTAMPDIFF(SECOND,'2007-12-30 12:01:01','2007-12-31 10:02:00'); 
-- result: 79259  the difference in seconds

因此,您可以使用TIMESTAMPDIFF来达到您的目的。


2
“天的秒差”到底是什么意思?我不明白为什么将TIMEDIFF的结果乘以24*60*60不等于TIMESTAMPDIFF的结果。 - David Tuite
这个解决方案对我很有效!但在我的情况下,我想以天为单位执行TIMESTAMPDIFF,但不考虑周末(周六/周日)。我的意思是,只计算工作日之间的差异...有没有简单的方法可以实现?如果没有,那我很抱歉给您带来的不便,我会寻找另一个解决方案。谢谢。 - Massa
8
TIMEDIFF在这个例子中是不正确的,因为它并不是这两天之间的秒数。TIMEDIFF返回一个包含小时、分钟和秒差异的时间值。将其乘以任何数都不会得到有用的答案。请使用TIMESTAMPDIFF。 - IvanD
5
有趣的是,TIMEDIFF() 函数期望开始时间和结束时间参数的顺序与 TIMESTAMPDIFF() 函数所期望的相反。 - Mr. Lance E Sloan
2
注意:使用TIMEDIFF函数时,时间值的范围可以从“-838:59:59”到“838:59:59”。 https://www.w3schools.com/SQl/func_mysql_timediff.asp - cREcker
我认为解决这个问题有几种方法:ROUND(TIMESTAMPDIFF(HOUR, updated_at, NOW()) / (1)) AS 'Date', 可以给出时间差,单位为小时。ROUND(TIMESTAMPDIFF(SECOND, updated_at, NOW()) / (1)) AS 'Date', 可以给出时间差,单位为秒。ROUND(TIMESTAMPDIFF(SECOND, updated_at, NOW()) / (60 * 60)) AS 'Date', 可以给出时间差,单位为小时。 - Olotin Temitope

48
如果您正在使用日期列(或可以将它们转换为日期列),请尝试使用DATEDIFF(),然后乘以24小时、60分钟、60秒(因为DATEDIFF返回的是天数差异)。来自MySQL:

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

例如:
mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30 00:00:00') * 24*60*60

7
我不认为这样行得通。DATEDIFF 不会返回小数部分。 - Juan Carlos Oropeza

44

使用DATEDIFF获取日期之间的天数差异

SELECT DATEDIFF('2010-10-08 18:23:13', '2010-09-21 21:40:36') AS days;
+------+
| days |
+------+
|   17 |
+------+

或者

请参考以下链接:MySql计算两个时间戳之间的天数?


亲爱的,这对于上面的问题是完美的,但是我想通过同一查询进行一些修改,请问你可以帮助我如何实现吗?这里我想将最终结果与我的值进行比较,例如 "SELECT * FROM table where datediff(today,databasedate) as days =3;"。类似这样的。 - Sooraj Abbasi
@SoorajAbbasi 回复一个旧评论,但是为了将来的参考:这只会检查日期是否恰好为3天 - 您可以执行 SELECT * FROM table WHERE DATE(database_date) = DATE_SUB(CURDATE(), INTERVAL 3 DAY) - Edward

9
SELECT TIMESTAMPDIFF(HOUR,NOW(),'2013-05-15 10:23:23')
   calculates difference in hour.(for days--> you have to define day replacing hour
SELECT DATEDIFF('2012-2-2','2012-2-1')

SELECT TO_DAYS ('2012-2-2')-TO_DAYS('2012-2-1')

4
select 
unix_timestamp('2007-12-30 00:00:00') - 
unix_timestamp('2007-11-30 00:00:00');

3
unix_timestamp是Unix类系统中计时的一种标准方式。它表示一个32位整数,指示自1970年01/01 00:00:00以来经过了多少秒。这是一个下限值。上限被限制在公元2106年,但由于常见程序不使用此值(而是使用有符号整数替代无符号整数),因此被认为是2038年的上限。 - Devid G
当经过夏令时时,错误地减少/增加。 - Devid G

2
如果您想使用DATEDIFF添加WHERE子句,则也可以添加WHERE子句或条件。请参阅以下示例。
select DATEDIFF(now(), '2022-08-12 17:55:51.000000') from properties p WHERE p.property_name = 'KEY';

结果:6


1
SELECT TIMESTAMPDIFF(SECOND,'2018-01-19 14:17:15','2018-01-20 14:17:15');

第二种方法

SELECT ( DATEDIFF('1993-02-20','1993-02-19')*( 24*60*60) )AS 'seccond';

CURRENT_TIME() --this will return current Date
DATEDIFF('','') --this function will return  DAYS and in 1 day there are 24hh 60mm 60sec

0

或者,您可以使用TIMEDIFF函数

mysql> SELECT TIMEDIFF('2000:01:01 00:00:00', '2000:01:01 00:00:00.000001');
'-00:00:00.000001'
mysql> SELECT TIMEDIFF('2008-12-31 23:59:59.000001' , '2008-12-30 01:01:01.000002');
 '46:58:57.999999'

TC想要以秒或毫秒为单位获取结果值。 - Devid G

0
select TO_CHAR(TRUNC(SYSDATE)+(to_date( '31-MAY-2012 12:25', 'DD-MON-YYYY HH24:MI') 
                             - to_date( '31-MAY-2012 10:37', 'DD-MON-YYYY HH24:MI')), 
        'HH24:MI:SS') from dual

-- 结果:01:48:00
好的,这不完全是 OP 所要求的,但这正是我想做的 :-)

0

这个函数计算两个日期之间的差值,并以 yyyy-mm-dd 的日期格式显示出来。您只需要执行下面的代码,然后使用该函数即可。执行后,您可以像这样使用它

SELECT datedifference(date1, date2)
FROM ....
.
.
.
.


DELIMITER $$

CREATE FUNCTION datedifference(date1 DATE, date2 DATE) RETURNS DATE
NO SQL

BEGIN
    DECLARE dif DATE;
    IF DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2)))) < 0    THEN
                SET dif=DATE_FORMAT(
                                        CONCAT(
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))DIV 12 , 
                                            '-',
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))% 12 , 
                                            '-',
                                            DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(DATE_SUB(date1, INTERVAL 1 MONTH)), '-', DAY(date2))))),
                                        '%Y-%m-%d');
    ELSEIF DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2)))) < DAY(LAST_DAY(DATE_SUB(date1, INTERVAL 1 MONTH))) THEN
                SET dif=DATE_FORMAT(
                                        CONCAT(
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))DIV 12 , 
                                            '-',
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))% 12 , 
                                            '-',
                                            DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2))))),
                                        '%Y-%m-%d');
    ELSE
                SET dif=DATE_FORMAT(
                                        CONCAT(
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))DIV 12 , 
                                            '-',
                                            PERIOD_DIFF(date_format(date1, '%y%m'),date_format(date2, '%y%m'))% 12 , 
                                            '-',
                                            DATEDIFF(date1, DATE(CONCAT(YEAR(date1),'-', MONTH(date1), '-', DAY(date2))))),
                                        '%Y-%m-%d');
    END IF;

RETURN dif;
END $$
DELIMITER;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接