MySQL中两个date之间的区别

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

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

如果您正在使用DATE列(或者可以将它们转换为date列),请尝试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 

使用DATEDIFF获取date差异

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

要么

请参阅下面的链接MySql中两个时间戳之间的差异?

 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') 
 select unix_timestamp('2007-12-30 00:00:00') - unix_timestamp('2007-11-30 00:00:00'); 

或者,您可以使用TIMEDIFFfunction

 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' 

此function取两个date之间的差异,并以date格式yyyy-mm-dd显示。 所有你需要的是执行下面的代码,然后使用该function。 执行后你可以像这样使用它

 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; 
 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问,但这是我想要做的:-)

此代码以yyyy MM dd格式计算两个date之间的差异。

 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) ' 

为什么不只是

从表中selectSum(Da​​te1 – Date2)

date1和date2是date时间

如果你的date存储在文本字段为string,你可以实现这个代码,它会获取过去一天,一个月或一年的sorting天数列表:

 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是你的date格式

这个查询显示你设置的date之间的logging,如:最近7天以下和最近14天以上,所以这将是你最后一周logging显示相同的概念是月份或年份。 无论您在下面提供的价值如何:7天以下,其他价值将是14天的两倍。 我们在这里说的是从过去的14天以及从过去的7天以下的所有logging。 这是一个星期的logging,你可以改变价值30-60天一个月,也是一年。

谢谢你希望它会帮助别人。

你只需要这样做:

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