Perbedaan antara dua tanggal di MySQL

173

Bagaimana cara menghitung perbedaan antara dua tanggal, dalam format YYYY-MM-DD hh: mm: ssdan untuk mendapatkan hasilnya dalam detik atau milidetik?

GeoGo
sumber
14
@didxga: Hati-hati: (akhir - awal) TIDAK mengembalikan selisih detik antara nilai datetime. Ini mengembalikan angka yang merupakan perbedaan antara angka desimal yang terlihat seperti yyyymmddhhmmss.
helloPiers

Jawaban:

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

Jadi, Anda bisa menggunakannya TIMESTAMPDIFFuntuk tujuan Anda.

Devid G
sumber
2
Apa arti "selisih detik dalam beberapa hari"? Saya tidak mengerti mengapa mengalikan hasil TIMEDIFFdengan 24*60*60tidak sama dengan hasil TIMESTAMPDIFF.
David Tuite
Solusi ini berhasil untuk saya! Tetapi dalam kasus saya, saya ingin melakukan TIMESTAMPDIFF di HARI, tetapi tidak mempertimbangkan akhir pekan (sat / sun). Maksudku, hanya perbedaan hari kerja ... Apakah mungkin dengan cara yang sederhana? Jika tidak, saya mohon maaf atas ketidaknyamanan ini maka saya akan mencari solusi lain. TKs.
Massa
8
TIMEDIFF dalam contoh ini salah karena itu bukan jumlah detik antara dua hari itu. TIMEDIFF mengembalikan nilai TIME, yang memiliki selisih jam, menit, dan detik. Mengalikannya tidak akan menghasilkan jawaban yang berguna. Gunakan TIMESTAMPDIFF.
IvanD
4
Menarik yang TIMEDIFF()mengharapkan argumen waktu mulai dan berakhir berada di urutan yang berlawanan dari yang diharapkan oleh TIMESTAMPDIFF().
LS
1
Catatan: Saat menggunakan fungsi TIMEDIFF, nilai waktu dapat berkisar dari "-838: 59: 59" hingga "838: 59: 59". w3schools.com/SQl/func_mysql_timediff.asp
cREcker
38

Jika Anda bekerja dengan kolom DATE (atau dapat menampilkannya sebagai kolom tanggal), coba DATEIFF () dan kemudian kalikan dengan 24 jam, 60 menit, 60 detik (karena DATEIFF mengembalikan perbedaan dalam beberapa hari). Dari MySQL:

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

sebagai contoh:

mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30 00:00:00') * 24*60*60
kvista
sumber
5
Saya rasa ini tidak berhasil. DATEDIFFtidak mengembalikan pecahan.
Juan Carlos Oropeza
29

Dapatkan perbedaan tanggal dalam beberapa hari menggunakan DATEDIFF

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

ATAU

Lihat tautan di bawah ini perbedaan MySql antara dua cap waktu dalam beberapa hari?

Kailas
sumber
Sayang, itu sempurna untuk pertanyaan di atas, tetapi saya ingin beberapa modifikasi dengan permintaan yang sama jadi tolong bantu saya bahwa bagaimana bisa mencapainya. di sini saya ingin membandingkan hasil akhir dengan nilai saya, SELECT * FROM table where datediff(today,databasedate) as days =3;seperti ini
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
sumber
4
select 
unix_timestamp('2007-12-30 00:00:00') - 
unix_timestamp('2007-11-30 00:00:00');
nyata
sumber
3
unix_timestamp - cara penetapan waktu standar dalam sistem mirip Unix. Merupakan integer 32-bit, menunjukkan berapa detik telah berlalu sejak 01/01/1970 00:00:00. Yaitu batas bawah. Batas atas dibatasi hingga 2.106 setahun, tetapi karena program yang sering tidak beroperasi dengan nilai ini (alih-alih bilangan bulat yang tidak ditandatangani menggunakan bilangan bulat yang ditandatangani) dianggap sebagai batas atas pada tahun 2038.
Devid G
+ ketika melewati DST salah dipotong / ditambahkan
Devid G
1
SELECT TIMESTAMPDIFF(SECOND,'2018-01-19 14:17:15','2018-01-20 14:17:15');

Pendekatan kedua

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
sumber
0

Atau, Anda bisa menggunakan fungsi 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
sumber
TC ingin mendapatkan nilai hasil dalam detik atau milidetik.
Devid G
0

Fungsi ini mengambil perbedaan antara dua tanggal dan menunjukkannya dalam format tanggal yyyy-mm-dd. Yang Anda butuhkan hanyalah menjalankan kode di bawah ini dan kemudian menggunakan fungsinya. Setelah mengeksekusi Anda dapat menggunakannya seperti ini

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
sumber
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

- hasil: 01:48:00

OK itu tidak seperti yang diminta OP, tapi itu yang ingin saya lakukan :-)

Orang
sumber
0

Kode ini menghitung selisih antara dua tanggal dalam format dd MM tttt.

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
sumber
Mengapa tidak menggunakan saja TIMESTAMPDIFFfungsinya?
codeforester
0

Jika Anda memiliki tanggal yang disimpan dalam bidang teks sebagai string, Anda dapat menerapkan kode ini. Ini akan mengambil daftar jumlah hari terakhir dalam seminggu, sebulan atau setahun yang menyortir:

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 adalah format tanggal Anda

Kueri ini menampilkan catatan antara hari-hari yang Anda atur di sana seperti: Di ​​bawah dari 7 hari terakhir dan Di atas dari 14 hari terakhir sehingga akan menjadi catatan minggu terakhir Anda untuk menampilkan konsep yang sama untuk bulan atau tahun. Nilai apa pun yang Anda berikan dalam tanggal di bawah ini seperti: di bawah ini dari 7-hari sehingga nilai lainnya akan menjadi dua kali lipat dari 14 hari. Apa yang kami katakan di sini dapatkan semua catatan di atas dari 14 hari terakhir dan di bawah ini dari 7 hari terakhir. Ini adalah catatan minggu Anda dapat mengubah nilai menjadi 30-60 hari selama sebulan dan juga selama setahun.

Terima Kasih Semoga ini bisa membantu seseorang.

A.Aleem11
sumber
-1

Anda cukup melakukan ini:

SELECT (end_time - start_time) FROM t; -- return in Millisecond
SELECT (end_time - start_time)/1000 FROM t; -- return in Second
didxga
sumber
5
Waspadalah: (akhir - awal) TIDAK mengembalikan selisih detik antara nilai datetime. Ini mengembalikan angka yang merupakan perbedaan antara angka desimal yang terlihat seperti yyyymmddhhmmss.
helloPiers
-1

Kenapa tidak adil?

Pilih Jumlah (Date1 - Date2) dari tabel

date1 dan date2 adalah datetime

Aikona
sumber
Ini tidak mengembalikan perbedaan tanggal dalam hitungan detik, melainkan mengembalikan perbedaan antara angka desimal yang terlihat seperti yyyymmddhhmmss. Jadi, ini tidak menyelesaikan pertanyaan OP. Hal yang sama juga disebutkan dalam komentar pada pertanyaan.
codeforester