Unterschied zwischen zwei Daten in MySQL


173

Wie berechnet man die Differenz zwischen zwei Daten im Format YYYY-MM-DD hh: mm: ssund erhält das Ergebnis in Sekunden oder Millisekunden?


14
@didxga: Achtung: (Ende - Start) gibt KEINE Sekunden Differenz zwischen Datum / Uhrzeit-Werten zurück. Es wird eine Zahl zurückgegeben, die den Unterschied zwischen Dezimalzahlen darstellt, die wie yyyymmddhhmmss aussehen.
HelloPiers

Antworten:


328
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

So können Sie TIMESTAMPDIFFfür Ihren Zweck verwenden.


2
Was bedeutet "der Unterschied in Sekunden für Tage" genau? Ich verstehe nicht, warum das Multiplizieren des Ergebnisses von TIMEDIFFmit dem Ergebnis von 24*60*60nicht gleich ist TIMESTAMPDIFF.
David Tuite

Diese Lösung hat bei mir funktioniert! Aber in meinem Fall möchte ich das TIMESTAMPDIFF am TAG durchführen, aber ohne Berücksichtigung der Wochenenden (Sa / So). Ich meine, nur Wochentagsunterschied ... Ist es auf einfache Weise möglich? Wenn nicht, entschuldige ich mich für die Unannehmlichkeiten und suche nach einer anderen Lösung. TKs.
Massa

8
TIMEDIFF im Beispiel ist falsch, da dies nicht die Anzahl der Sekunden zwischen diesen beiden Tagen ist. TIMEDIFF gibt einen TIME-Wert zurück, der Stunden, Minuten und Sekunden der Differenz enthält. Wenn Sie es multiplizieren, erhalten Sie keine nützliche Antwort. Verwenden Sie TIMESTAMPDIFF.
IvanD

4
Interessant, dass TIMEDIFF()erwartet wird , dass die Argumente für Anfangs- und Endzeit in der entgegengesetzten Reihenfolge liegen als von erwartet TIMESTAMPDIFF().
LS

1
Hinweis: Bei Verwendung der TIMEDIFF-Funktion kann der Zeitwert zwischen "-838: 59: 59" und "838: 59: 59" liegen. w3schools.com/SQl/func_mysql_timediff.asp
cREcker

38

Wenn Sie mit DATE-Spalten arbeiten (oder diese als Datumsspalten umwandeln können), versuchen Sie es mit DATEDIFF () und multiplizieren Sie dann mit 24 Stunden, 60 Minuten und 60 Sekunden (da DATEDIFF diff in Tagen zurückgibt). Von MySQL:

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

beispielsweise:

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

5
Ich glaube nicht, dass diese Arbeit. DATEDIFFgibt keine Brüche zurück.
Juan Carlos Oropeza

29

Ermitteln Sie die Datumsdifferenz in Tagen mit DATEDIFF

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

ODER

Siehe den folgenden Link MySQL-Unterschied zwischen zwei Zeitstempeln in Tagen?


Lieber, es ist perfekt für die obige Frage, aber ich möchte eine Modifikation mit der gleichen Abfrage, also könnte mir bitte helfen, wie man das erreichen kann. hier möchte ich das Endergebnis mit meinem Wert vergleichen, so SELECT * FROM table where datediff(today,databasedate) as days =3;etwas wie das
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 - eine Standardmethode für das Timing in Unix-ähnlichen Systemen. Stellt eine 32-Bit-Ganzzahl dar, die angibt, wie viele Sekunden seit dem 01.01.1970 00:00:00 vergangen sind. Dh eine Untergrenze. Die Obergrenze ist auf 2.106 pro Jahr begrenzt, wird jedoch aufgrund häufiger Programme, die nicht mit diesem Wert arbeiten (anstelle einer vorzeichenlosen Ganzzahl mit vorzeichenbehafteter Ganzzahl), 2038 als Obergrenze angesehen.
Devid G

+ beim Durchlaufen der Sommerzeit wird fälschlicherweise abgezogen / hinzugefügt
Devid G

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

Zweiter Ansatz

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

Oder Sie können die TIMEDIFF-Funktion verwenden

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 möchte den Ergebniswert in Sekunden oder Millisekunden erhalten.
Devid G

0

Diese Funktion nimmt die Differenz zwischen zwei Daten und zeigt sie in einem Datumsformat JJJJ-MM-TT an. Sie müssen lediglich den folgenden Code ausführen und dann die Funktion verwenden. Nach der Ausführung können Sie es so verwenden

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

- Ergebnis: 01:48:00

OK, es ist nicht ganz das, was das OP gefragt hat, aber es ist das, was ich tun wollte :-)


0

Dieser Code berechnet die Differenz zwischen zwei Daten im Format JJJJ MM TT.

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

Warum nicht einfach die TIMESTAMPDIFFFunktion nutzen?
Codeforester

0

Wenn Sie ein Datum im Textfeld als Zeichenfolge gespeichert haben, können Sie diesen Code implementieren. Er ruft die Liste der vergangenen Tage pro Woche, eines Monats oder eines Jahres ab und sortiert:

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 ist Ihr Datumsformat

Diese Abfrage zeigt den Datensatz zwischen den Tagen an, die Sie dort festgelegt haben, wie folgt: Unten von den letzten 7 Tagen und Oben von den letzten 14 Tagen. Es wäre also Ihr Datensatz für die letzte Woche, wenn dasselbe Konzept für Monat oder Jahr angezeigt wird. Welchen Wert Sie auch immer unter dem Datum angeben, wie: unten ab 7 Tagen, der andere Wert wäre also doppelt so hoch wie 14 Tage. Was wir hier sagen, erhalten Sie alle Aufzeichnungen oben von den letzten 14 Tagen und unten von den letzten 7 Tagen. Dies ist ein Wochenrekord, den Sie für einen Monat und auch für ein Jahr auf 30-60 Tage ändern können.

Danke Ich hoffe, es wird jemandem helfen.


-1

Sie würden dies einfach tun:

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

5
Achtung: (Ende - Start) gibt KEINE Sekunden Differenz zwischen Datum / Uhrzeit-Werten zurück. Es wird eine Zahl zurückgegeben, die den Unterschied zwischen Dezimalzahlen darstellt, die wie yyyymmddhhmmss aussehen.
HelloPiers

-1

Warum nicht einfach

Wählen Sie Summe (Datum1 - Datum2) aus der Tabelle

Datum1 und Datum2 sind Datum / Uhrzeit


Dies gibt nicht die Datumsdifferenz in Sekunden zurück, sondern die Differenz zwischen Dezimalzahlen, die wie yyyymmddhhmmss aussehen. Dies löst also nicht die Frage von OP. Dasselbe wird auch im Kommentar zur Frage erwähnt.
Codeforester
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.