MySQL中两个日期之间的差异


172

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


14
@didxga:注意:(结束-开始)不会返回日期时间值之间的秒差。它返回一个数字,该数字是看起来像yyyymmddhhmmss的十进制数字之间的差。
helloPiers

Answers:


327
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
“几天的秒数差异”到底是什么意思?我不明白为什么相乘的结果TIMEDIFF24*60*60不等于结果TIMESTAMPDIFF
David Tuite

这个解决方案对我有用!但就我而言,我想在DAY进行TIMESTAMPDIFF,但不考虑周末(周六/周日)。我的意思是,只有一周的天差...有可能以简单的方式吗?如果没有,对于给您带来的不便,我深表歉意,然后我将寻找其他解决方案。传统知识。
马萨

8
该示例中的TIMEDIFF是错误的,因为这不是这两天之间的秒数。TIMEDIFF返回一个TIME值,该值具有小时,分钟和秒的差异。乘以它不会产生有用的答案。使用TIMESTAMPDIFF。
IvanD

4
有趣的是,TIMEDIFF()期望开始和结束时间参数的顺序与所期望的相反TIMESTAMPDIFF()
LS

1
注意:使用TIMEDIFF功能时,时间值的范围可以从“ -838:59:59”到“ 838:59:59”。 w3schools.com/SQl/func_mysql_timediff.asp
cREcker


29

使用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

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年1月1日00:00:00起经过了多少秒。即下限。上限限制为每年2106,但是由于频繁的程序无法使用该值(而不是使用有符号整数的无符号整数)进行操作,因此认为上限在2038
。– Devid G

+错误地扣除/添加了通过DST的信息
Devid G

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 2011年

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;

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格式计算两个日期之间的差异。

declare @StartDate datetime 
declare @EndDate datetime

declare @years int
declare @months int 
declare @days int

--NOTE: date of birth must be smaller than As on date, 
--else it could produce wrong results
set @StartDate = '2013-12-30' --birthdate
set @EndDate  = Getdate()            --current datetime

--calculate years
select @years = datediff(year,@StartDate,@EndDate)

--calculate months if it's value is negative then it 
--indicates after __ months; __ years will be complete
--To resolve this, we have taken a flag @MonthOverflow...
declare @monthOverflow int
select @monthOverflow = case when datediff(month,@StartDate,@EndDate) - 
  ( datediff(year,@StartDate,@EndDate) * 12) <0 then -1 else 1 end
--decrease year by 1 if months are Overflowed
select @Years = case when @monthOverflow < 0 then @years-1 else @years end
select @months =  datediff(month,@StartDate,@EndDate) - (@years * 12) 

--as we do for month overflow criteria for days and hours 
--& minutes logic will followed same way
declare @LastdayOfMonth int
select @LastdayOfMonth =  datepart(d,DATEADD
    (s,-1,DATEADD(mm, DATEDIFF(m,0,@EndDate)+1,0)))

select @days = case when @monthOverflow<0 and 
    DAY(@StartDate)> DAY(@EndDate) 
then @LastdayOfMonth + 
  (datepart(d,@EndDate) - datepart(d,@StartDate) ) - 1  
      else datepart(d,@EndDate) - datepart(d,@StartDate) end 


select
 @Months=case when @days < 0 or DAY(@StartDate)> DAY(@EndDate) then @Months-1 else @Months end

Declare @lastdayAsOnDate int;
set @lastdayAsOnDate = datepart(d,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@EndDate),0)));
Declare @lastdayBirthdate int;
set @lastdayBirthdate =  datepart(d,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@StartDate)+1,0)));

if (@Days < 0) 
(
    select @Days = case when( @lastdayBirthdate > @lastdayAsOnDate) then
        @lastdayBirthdate + @Days
    else
        @lastdayAsOnDate + @Days
    end
)
print  convert(varchar,@years)   + ' year(s),   '  +
       convert(varchar,@months)  + ' month(s),   ' +
       convert(varchar,@days)    + ' day(s)   '   

为什么不简单使用该TIMESTAMPDIFF功能?
codeforester

0

如果您将日期存储在文本字段中作为字符串,则可以实现此代码,它将获取过去一周,一个月或一年的天数列表:

SELECT * FROM `table` WHERE STR_TO_DATE(mydate, '%d/%m/%Y') < CURDATE() - INTERVAL 30 DAY AND STR_TO_DATE(date, '%d/%m/%Y') > CURDATE() - INTERVAL 60 DAY

//This is for a month

SELECT * FROM `table` WHERE STR_TO_DATE(mydate, '%d/%m/%Y') < CURDATE() - INTERVAL 7 DAY AND STR_TO_DATE(date, '%d/%m/%Y') > CURDATE() - INTERVAL 14 DAY

//This is for a week 

%d%m%Y是您的日期格式

此查询显示您在其中设置的日期之间的记录,例如:最近7天以下和最近14天以上,因此这将是您的上周记录,以显示与月或年相同的概念。无论您在以下日期中提供什么值,例如:7天以下,因此另一个值将是其14天的两倍。我们在这里所说的是获取过去14天以上和过去7天以下的所有记录。这是一个星期记录,您可以将一个月或一年的值更改为30-60天。

谢谢希望对您有所帮助。


-1

您只需执行以下操作:

SELECT (end_time - start_time) FROM t; -- return in Millisecond
SELECT (end_time - start_time)/1000 FROM t; -- return in Second

5
请注意:(结束-开始)不会返回日期时间值之间的秒差。它返回一个数字,该数字是看起来像yyyymmddhhmmss的十进制数字之间的差。
helloPiers

-1

为什么不只是

从表中选择Sum(Da​​te1-Date2)

date1和date2是日期时间


这不会返回以秒为单位的日期差,而是返回看起来像yyyymmddhhmmss的十进制数字之间的差。因此,这不能解决OP的问题。关于问题的评论中也提到了同样的事情。
codeforester
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.