Différence entre deux dates dans MySQL

173

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

GeoGo
la source
14
@didxga: Attention: (end - start) ne renvoie PAS une seconde de différence entre les valeurs datetime. Il renvoie un nombre correspondant à la différence entre les nombres décimaux qui ressemblent à aaaammjjhhmmss.
helloPiers

Réponses:

330
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

Ainsi, vous pouvez utiliser TIMESTAMPDIFFpour votre but.

Devid G
la source
2
Que signifie exactement «la différence en secondes par jour»? Je ne comprends pas pourquoi multiplier le résultat de TIMEDIFFpar 24*60*60n'est pas égal au résultat de TIMESTAMPDIFF.
David Tuite
Cette solution a fonctionné pour moi! Mais dans mon cas, j'aimerais jouer le TIMESTAMPDIFF en JOUR, mais sans tenir compte des week-ends (samedi / soleil). Je veux dire, seulement la différence des jours de la semaine ... Est-ce possible d'une manière simple? Sinon, je m'excuse pour la gêne occasionnée, alors je chercherai une autre solution. Les savoirs traditionnels.
Massa
8
TIMEDIFF dans l'exemple est incorrect car ce n'est pas le nombre de secondes entre ces deux jours. TIMEDIFF renvoie une valeur TIME, qui comprend les heures, les minutes et les secondes de la différence. Le multiplier ne donnera pas une réponse utile. Utilisez TIMESTAMPDIFF.
IvanD
4
Intéressant qui TIMEDIFF()s'attend à ce que les arguments d'heure de début et de fin soient dans l'ordre opposé à celui attendu par TIMESTAMPDIFF().
LS
1
Remarque: Lors de l'utilisation de la fonction TIMEDIFF, la valeur de l'heure peut être comprise entre "-838: 59: 59" et "838: 59: 59". w3schools.com/SQl/func_mysql_timediff.asp
cREcker
38

Si vous travaillez avec des colonnes DATE (ou pouvez les convertir en colonnes de date), essayez DATEDIFF (), puis multipliez par 24 heures, 60 min, 60 secondes (puisque DATEDIFF renvoie la différence en jours). Depuis 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
kvista
la source
5
Je ne pense pas que ce travail. DATEDIFFne renvoie pas de fractions.
Juan Carlos Oropeza
29

Obtenez la différence de date en jours à l'aide de 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 MySql différence entre deux horodatages en jours?

Kailas
la source
cher, c'est parfait pour la question ci-dessus, mais je veux une modification avec la même requête, alors je pourrais s'il vous plaît m'aider à savoir comment y parvenir. ici, je veux comparer le résultat final avec ma valeur, comme SELECT * FROM table where datediff(today,databasedate) as days =3;quelque chose comme ça
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')
Romancha KC
la source
4
select 
unix_timestamp('2007-12-30 00:00:00') - 
unix_timestamp('2007-11-30 00:00:00');
ajreal
la source
3
unix_timestamp - une manière standard de chronométrer dans les systèmes de type Unix. Représente un entier 32 bits, indiquant le nombre de secondes écoulées depuis le 01/01/1970 00:00:00. Ie une limite inférieure. La limite supérieure est limitée à 2106 par an, mais en raison de programmes fréquents, elle ne fonctionne pas avec cette valeur (au lieu d'un entier non signé utilisant un entier signé) est considérée comme la limite supérieure en 2038.
Devid G
+ lorsque le passage à l'heure d'été est incorrectement déduit / ajouté
Devid G
1
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
abdul rehman kk
la source
0

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'
Anton Sizikov
la source
TC veut obtenir la valeur des résultats en secondes ou en millisecondes.
Devid G
0

Cette fonction prend la différence entre deux dates et l'affiche dans un format de date aaaa-mm-jj. Tout ce dont vous avez besoin est d'exécuter le code ci-dessous, puis d'utiliser la fonction. Après l'exécution, vous pouvez l'utiliser comme ceci

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;
enor
la source
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

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

Gars
la source
0

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)   '   
Mohan Kumar
la source
Pourquoi ne pas simplement utiliser la TIMESTAMPDIFFfonction?
codeforester
0

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 des derniers jours par semaine, un mois ou une année de tri:

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 avez définis comme suit: En dessous des 7 derniers jours et Au-dessus des 14 derniers jours, ce serait donc votre enregistrement de la semaine dernière à afficher le même concept que celui du mois ou de l'année. Quelle que soit la valeur que vous fournissez dans la date ci-dessous, comme: ci-dessous à partir de 7 jours, l'autre valeur serait donc le double de 14 jours. Ce que nous disons ici, récupérez tous les enregistrements ci-dessus des 14 derniers jours et inférieurs des 7 derniers jours. Il s'agit d'un enregistrement hebdomadaire dont vous pouvez changer la valeur en 30-60 jours pendant un mois et aussi pendant un an.

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

A.Aleem11
la source
-1

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
didxga
la source
5
Attention: (fin - début) ne renvoie PAS une seconde de différence entre les valeurs de date / heure. Il renvoie un nombre correspondant à la différence entre les nombres décimaux qui ressemblent à aaaammjjhhmmss.
helloPiers
-1

Pourquoi pas juste

Sélectionnez Somme (Date1 - Date2) dans le tableau

date1 et date2 sont datetime

Aikona
la source
Cela ne renvoie pas la différence de date en secondes, mais renvoie plutôt la différence entre les nombres décimaux qui ressemblent à aaaammjjhhmmss. Donc, cela ne résout pas la question d'OP. La même chose est également mentionnée dans le commentaire sur la question.
codeforester