Sự khác biệt giữa hai ngày trong MySQL


173

Làm thế nào để tính toán sự khác biệt giữa hai ngày, trong định dạng YYYY-MM-DD hh: mm: ssvà để có được kết quả tính bằng giây hoặc mili giây?


14
@didxga: Cẩn thận: (kết thúc - bắt đầu) KHÔNG trả về chênh lệch giây giữa các giá trị datetime. Nó trả về một số là sự khác biệt giữa các số thập phân trông giống như yyyymmddhhmmss.
helloPiers

Câu trả lời:


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

Vì vậy, bạn có thể sử dụng TIMESTAMPDIFFcho mục đích của bạn.


2
"Sự khác biệt trong vài giây cho ngày" có nghĩa là gì? Tôi không hiểu tại sao nhân kết quả TIMEDIFFbằng 24*60*60không bằng kết quả của TIMESTAMPDIFF.
David Tuite

Giải pháp này đã làm việc cho tôi! Nhưng trong trường hợp của tôi, tôi rất thích thực hiện TIMESTAMPDIFF trong NGÀY, nhưng không xem xét các ngày cuối tuần (sat / sun). Ý tôi là, chỉ có sự khác biệt ngày trong tuần ... Có thể theo một cách đơn giản? Nếu không, tôi xin lỗi vì sự bất tiện này, sau đó tôi sẽ tìm giải pháp khác. TK.
Massa

8
TIMEDIFF trong ví dụ không chính xác vì đó không phải là số giây giữa hai ngày đó. TIMEDIFF trả về giá trị TIME, có giờ, phút và giây chênh lệch. Nhân nó sẽ không mang lại một câu trả lời hữu ích. Sử dụng TIMESTAMPDIFF.
IvanD

4
Thật thú vị khi TIMEDIFF()kỳ vọng các đối số thời gian bắt đầu và kết thúc sẽ theo thứ tự ngược lại so với dự kiến TIMESTAMPDIFF().
LS

1
Lưu ý: Khi sử dụng chức năng TIMEDIFF, giá trị thời gian có thể nằm trong khoảng từ "-838: 59: 59" đến "838: 59: 59". w3schools.com/SQl/func_mysql_timediff.asp
cREcker

38

Nếu bạn đang làm việc với các cột DATE (hoặc có thể chuyển chúng thành các cột ngày), hãy thử DATEDIFF () và sau đó nhân với 24 giờ, 60 phút, 60 giây (vì DATEDIFF trả về chênh lệch theo ngày). Từ MySQL:

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

ví dụ:

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

5
Tôi không nghĩ rằng công việc này. DATEDIFFkhông trả về phân số.
Juan Carlos Oropeza

29

Nhận chênh lệch ngày tính theo ngày bằng DATEDIFF

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

HOẶC LÀ

Tham khảo liên kết dưới đây MySql khác biệt giữa hai dấu thời gian trong ngày?


thân yêu, nó hoàn hảo cho câu hỏi trên, nhưng tôi muốn một số sửa đổi với cùng một truy vấn vì vậy có thể vui lòng giúp tôi rằng làm thế nào có thể đạt được điều đó. Ở đây tôi muốn so sánh kết quả cuối cùng với giá trị của tôi, như SELECT * FROM table where datediff(today,databasedate) as days =3;một thứ như thế này
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 - một cách định thời chuẩn trong các hệ thống giống Unix. Biểu thị số nguyên 32 bit, cho biết số giây đã trôi qua kể từ ngày 01/01/1970 00:00:00. Tức là một giới hạn thấp hơn. Ranh giới trên được giới hạn ở 2.106 một năm, nhưng do các chương trình thường xuyên không hoạt động với giá trị này (thay vì số nguyên không dấu sử dụng số nguyên đã ký) được coi là giới hạn trên vào năm 2038.
Devid G

+ khi chuyển qua DST bị khấu trừ / thêm không chính xác
Devid G

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

Cách tiếp cận thứ hai

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

Hoặc, bạn có thể sử dụng chức năng 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'

TC muốn nhận giá trị kết quả tính bằng giây hoặc mili giây.
Dev G

0

Hàm này có sự khác biệt giữa hai ngày và hiển thị nó ở định dạng ngày yyyy-mm-dd. Tất cả bạn cần là thực thi mã dưới đây và sau đó sử dụng chức năng. Sau khi thực hiện, bạn có thể sử dụng nó như thế này

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

- kết quả: 01:48:00

OK nó không hoàn toàn là những gì OP yêu cầu, nhưng đó là những gì tôi muốn làm :-)


0

Mã này tính toán sự khác biệt giữa hai ngày trong định dạng dd yyyy MM.

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

Tại sao không chỉ đơn giản là sử dụng TIMESTAMPDIFFchức năng?
tiền mã hóa

0

Nếu bạn có một ngày được lưu trữ trong trường văn bản dưới dạng chuỗi, bạn có thể triển khai mã này, nó sẽ tìm nạp danh sách số ngày đã qua trong tuần, sắp xếp một tháng hoặc một năm:

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 là định dạng ngày của bạn

Truy vấn này hiển thị bản ghi giữa các ngày bạn đặt ở đó như: Dưới đây từ 7 ngày trước và Trên từ 14 ngày trước, do đó, bản ghi tuần trước của bạn sẽ được hiển thị cùng một khái niệm là tháng hoặc năm. Bất kỳ giá trị nào bạn cung cấp trong ngày dưới đây như: dưới 7 ngày, vì vậy giá trị khác sẽ tăng gấp đôi sau 14 ngày. Những gì chúng tôi đang nói ở đây có được tất cả các hồ sơ ở trên từ 14 ngày qua và dưới 7 ngày qua. Đây là một kỷ lục tuần bạn có thể thay đổi giá trị thành 30-60 ngày trong một tháng và cũng trong một năm.

Cảm ơn bạn Hy vọng nó sẽ giúp được ai đó.


-1

Bạn chỉ cần làm điều này:

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

5
Chú ý: (kết thúc - bắt đầu) KHÔNG trả về chênh lệch giây giữa các giá trị datetime. Nó trả về một số là sự khác biệt giữa các số thập phân trông giống như yyyymmddhhmmss.
helloPiers

-1

Tại sao không chỉ

Chọn Sum (Date1 - Date2) từ bảng

date1 và date2 là datetime


Điều này không trả về chênh lệch ngày tính bằng giây, thay vào đó, nó trả về chênh lệch giữa các số thập phân trông giống như yyyymmddhhmmss. Vì vậy, điều này không giải quyết được câu hỏi của OP. Điều tương tự cũng được đề cập trong bình luận về câu hỏi là tốt.
codeforester
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.