MySQL'de iki tarih arasındaki fark


173

İki tarih arasındaki farkı, formatta nasıl hesaplayabilir ve YYYY-MM-DD hh: mm: sssonucu saniye veya milisaniye olarak nasıl elde edebilirim?


14
@didxga: Dikkat: (bitiş-başlangıcı) datetime değerleri arasında bir saniye farkı döndürmez. Yyyymmddhhmmss gibi görünen ondalık sayılar arasındaki fark olan bir sayı döndürür.
helloPiers

Yanıtlar:


329
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

Böylece, TIMESTAMPDIFFamacınız için kullanabilirsiniz .


2
"Günler için saniye cinsinden fark" tam olarak ne anlama geliyor? Sonucunu çarparak neden anlamıyorum TIMEDIFFtarafından 24*60*60sonucuna eşit değildir TIMESTAMPDIFF.
David Tuite

Bu çözüm benim için çalıştı! Ama benim durumumda, TIMESTAMPDIFF'i DAY'de yapmak istiyorum, ancak hafta sonlarını (sat / sun) düşünmek istemiyorum. Yani, sadece hafta gün farkı ... Basit bir şekilde mümkün mü? Değilse, rahatsızlıktan dolayı özür dilerim, o zaman başka bir çözüm arayacağım. TKs.
Massa

8
Örnekteki TIMEDIFF yanlış, çünkü bu iki gün arasındaki saniye sayısı değil. TIMEDIFF saat, dakika ve saniye farkı olan bir TIME değeri döndürür. Bunu çarpmak yararlı bir cevap vermez. TIMESTAMPDIFF kullanın.
IvanD

4
TIMEDIFF()Başlangıç ​​ve bitiş zamanı argümanlarının beklenenden ters sırada olmasını bekleyen ilginç TIMESTAMPDIFF().
LS

1
Not: TIMEDIFF işlevini kullanırken, zaman değeri "-838: 59: 59" ile "838: 59: 59" arasında değişebilir. w3schools.com/SQl/func_mysql_timediff.asp
cREcker

38

DATE sütunlarıyla çalışıyorsanız (veya bunları tarih sütunları olarak yayınlayabiliyorsanız), DATEDIFF () öğesini deneyin ve ardından 24 saat, 60 dakika, 60 saniye ile çarpın (DATEDIFF gün cinsinden farklı olduğundan). MySQL'den:

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

Örneğin:

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

5
Bu işi sanmıyorum. DATEDIFFkesirleri döndürmez.
Juan Carlos Oropeza

29

DATEDIFF kullanarak günlerdeki tarih farkını alın

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

VEYA

Gün cinsinden iki zaman damgası arasındaki aşağıdaki bağlantı MySql farkına bakın ?


sevgili, onun yukarıdaki soru için mükemmel, ama ben aynı sorgu ile bazı değişiklikler istiyorum bu yüzden bana nasıl bu başarılı olabilir bana yardımcı olabilir. burada böyle bir SELECT * FROM table where datediff(today,databasedate) as days =3;şey gibi son sonucu benim değer ile karşılaştırmak istiyorum
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 benzeri sistemlerde standart zamanlama yöntemi. 01/01/1970 00:00:00 tarihinden bu yana kaç saniye geçtiğini gösteren 32 bitlik bir tamsayıyı temsil eder. Yani daha düşük bir limit. Üst sınır yılda 2.106 ile sınırlıdır, ancak sık programlardan dolayı bu değerle çalışmaz (işaretli tam sayı kullanan imzasız bir tamsayı yerine) 2038'de üst sınır olarak kabul edilir.
Devid G

+ DST'den geçerken yanlış çıkarılır / eklenir
Devid G

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

İkinci yaklaşım

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

Veya, TIMEDIFF işlevini kullanabilirsiniz

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 sonuç değerini saniye veya milisaniye olarak almak istiyor.
Devid G

0

Bu işlev iki tarih arasındaki farkı alır ve bunu yyyy-aa-gg tarih biçiminde gösterir. Tek ihtiyacınız olan aşağıdaki kodu çalıştırmak ve daha sonra fonksiyonu kullanmaktır. Yürüttükten sonra şu şekilde kullanabilirsiniz

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

- sonuç: 01:48:00

Tamam OP tam olarak ne istedi değil, ama ne yapmak istedim :-)


0

Bu kod, yyyy AA gg biçimindeki iki tarih arasındaki farkı hesaplar.

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

Neden sadece TIMESTAMPDIFFişlevi kullanmıyorsunuz ?
codeforester

0

Metin alanında dize olarak depolanan bir tarih varsa, bu kodu uygulayabilirsiniz; bu, hafta, ay veya yıl sıralamasında geçmiş gün sayısını listeler:

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, tarih biçiminizdir

Bu sorgu, şu şekilde ayarladığınız günler arasındaki kaydı gösterir: Son 7 günün altında ve son 14 günün üstünde, bu nedenle ay veya yıl için aynı kavramın görüntülenmesi son hafta kaydınız olacaktır. Aşağıdaki tarihte verdiğiniz değer ne olursa olsun: 7 günden az, böylece diğer değer 14 gün olarak iki katına çıkacaktır. Burada söylediklerimiz son 14 günden yukarıda ve son 7 günden itibaren tüm kayıtları alıyor. Bu, bir ay ve ayrıca bir yıl için değeri 30-60 gün olarak değiştirebileceğiniz bir haftalık kayıttır.

Teşekkür ederim Umarım birine yardımcı olur.


-1

Bunu yapmanız yeterlidir:

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

5
Dikkat: (başlangıç ​​- bitiş), tarih / saat değerleri arasında bir saniye farkı döndürmez. Yyyymmddhhmmss gibi görünen ondalık sayılar arasındaki fark olan bir sayı döndürür.
helloPiers

-1

Neden sadece

Tablodan Toplamı (Tarih1 - Tarih2) seçin

tarih1 ve tarih2 datetime


Bu, tarih farkını saniye cinsinden döndürmez, bunun yerine yyyymmddhhmmss gibi görünen ondalık sayılar arasındaki farkı döndürür. Bu OP'nin sorusunu çözmez. Aynı şey, soru hakkındaki yorumda da belirtilmiştir.
codeforester
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.