Différence entre deux dates dans MySQL

Comment calculer la différence entre deux dates, au format YYYY-MM-DD hh: mm: ss et pour obtenir le résultat en secondes ou en millisecondes?

 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 

Vous pouvez donc utiliser TIMESTAMPDIFF pour votre objective.

Si vous travaillez avec des colonnes DATE (ou pouvez les convertir en colonnes de date), essayez DATEDIFF (), puis multipliez par 24 heures, 60 minutes et 60 secondes (puisque DATEDIFF renvoie diff en jours). De MySQL:

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

par exemple:

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

Obtenez la différence de date en jours en utilisant DATEDIFF

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

OU

Reportez-vous au lien ci-dessous différence MySql entre deux horodatages en jours?

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

Ou, vous pouvez utiliser la fonction 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' 

Cette fonction prend la différence entre deux dates et l’affiche dans un format de date aaaa-mm-jj. Il vous suffit d’exécuter le code ci-dessous, puis d’utiliser la fonction. Après l’exécution, vous pouvez l’utiliser comme ça

 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 

– résultat: 01:48:00

OK ce n’est pas tout à fait ce que l’OP a demandé, mais c’est ce que je voulais faire 🙂

Ce code calcule la différence entre deux dates au format aaaa MM jj.

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

Si vous avez une date stockée dans le champ de texte sous forme de chaîne, vous pouvez implémenter ce code, il récupérera la liste du nombre de jours passés par semaine, par mois ou par année:

 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 est votre format de date

Cette requête affiche l’enregistrement entre les jours que vous définissez comme suit: Ci-dessous des 7 derniers jours et Ci-dessus des 14 derniers jours, il serait donc votre dernier enregistrement de la semaine à afficher le même concept pour le mois ou l’année. Quelle que soit la valeur que vous fournissez en dessous de la date, comme suit: ci-dessous de 7 jours, l’autre valeur serait son double de 14 jours. Ce que nous disons ici, obtenez tous les enregistrements ci-dessus des 14 derniers jours et des 7 derniers jours. Ceci est un enregistrement hebdomadaire que vous pouvez changer de valeur à 30-60 jours pour un mois et aussi pour un an.

Merci J’espère que cela aidera quelqu’un.

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

Deuxième approche

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 

Vous feriez simplement ceci:

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

Pourquoi pas juste

Sélectionnez Somme (Date1 – Date2) du tableau

date1 et date2 sont datetime