ความแตกต่างระหว่างสองวันใน MySQL


173

จะคำนวณความแตกต่างระหว่างวันที่สองวันในรูปแบบYYYY-MM-DD hh: mm: ssและรับผลลัพธ์เป็นวินาทีหรือมิลลิวินาทีได้อย่างไร


14
@didxga: ระวัง: (สิ้นสุด - เริ่มต้น) จะไม่ส่งคืนความแตกต่างระหว่างค่าวันที่และเวลา มันจะคืนค่าตัวเลขที่เป็นความแตกต่างระหว่างตัวเลขทศนิยมที่ดูเหมือน yyyymmddhhmmss
helloPiers

คำตอบ:


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

ดังนั้นคุณสามารถใช้TIMESTAMPDIFFเพื่อวัตถุประสงค์ของคุณ


2
"ความแตกต่างในไม่กี่วินาทีสำหรับวัน" หมายถึงอะไรกันแน่ ผมไม่เข้าใจว่าทำไมคูณผลของTIMEDIFFโดยไม่เท่ากับผลมาจากการ24*60*60 TIMESTAMPDIFF
David Tuite

วิธีนี้ใช้ได้ผลสำหรับฉัน! แต่ในกรณีของฉันฉันต้องการแสดง TIMESTAMPDIFF ในวัน แต่ไม่พิจารณาวันหยุดสุดสัปดาห์ (เสาร์ / อาทิตย์) ฉันหมายถึงความแตกต่างเพียงสัปดาห์วัน ... เป็นไปได้ในวิธีที่ง่าย? ถ้าไม่ฉันขอขอบคุณสำหรับความไม่สะดวกจากนั้นฉันจะหาวิธีแก้ไขปัญหาอื่น TKs
Massa

8
TIMEDIFF ในตัวอย่างไม่ถูกต้องเนื่องจากไม่ใช่จำนวนวินาทีระหว่างสองวันนั้น TIMEDIFF ส่งคืนค่า TIME ซึ่งมีชั่วโมงนาทีและวินาทีของความแตกต่าง การทวีคูณมันจะไม่เกิดประโยชน์คำตอบ ใช้ TIMESTAMPDIFF
IvanD

4
สิ่งที่น่าสนใจที่TIMEDIFF()คาดว่าข้อโต้แย้งเวลาเริ่มต้นและเวลาสิ้นสุดจะอยู่ในลำดับตรงกันข้ามกับที่คาดTIMESTAMPDIFF()ไว้
LS

1
หมายเหตุ: เมื่อใช้ฟังก์ชัน TIMEDIFF ค่าเวลาสามารถอยู่ในช่วงตั้งแต่ "-838: 59: 59" ถึง "838: 59: 59" w3schools.com/SQl/func_mysql_timediff.asp
cREcker

38

หากคุณทำงานกับคอลัมน์ DATE (หรือสามารถแปลงเป็นคอลัมน์วันที่) ให้ลอง DATEDIFF () แล้วคูณด้วย 24 ชั่วโมง 60 นาที 60 วินาที (เนื่องจาก DATEDIFF ส่งกลับต่างวัน) จาก MySQL:

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

ตัวอย่างเช่น:

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

5
ฉันไม่คิดว่างานนี้ DATEDIFFไม่คืนเศษส่วน
Juan Carlos Oropeza

29

รับผลต่างวันในหน่วยวันโดยใช้ DATEDIFF

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

หรือ

อ้างอิงลิงค์ด้านล่าง MySql แตกต่างกันระหว่างการประทับเวลาสองครั้งต่อวัน?


ที่รักมันสมบูรณ์แบบสำหรับคำถามข้างต้น แต่ฉันต้องการการปรับเปลี่ยนบางอย่างที่มีคำถามเดียวกันดังนั้นโปรดช่วยฉันได้ว่าจะทำได้อย่างไร ที่นี่ฉันต้องการเปรียบเทียบผลลัพธ์ที่ได้กับค่าของฉันSELECT * FROM table where datediff(today,databasedate) as days =3;เช่นนี้
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-like แสดงให้เห็นถึงจำนวนเต็ม 32 บิตที่ระบุจำนวนวินาทีที่ผ่านไปตั้งแต่ 01/01/1970 00:00:00 นั่นคือขีด จำกัด ที่ต่ำกว่า ขอบเขตด้านบนถูก จำกัด ไว้ที่ 2,106 ต่อปี แต่เนื่องจากโปรแกรมที่ใช้งานบ่อยไม่สามารถใช้งานได้กับค่านี้ (แทนที่จะเป็นจำนวนเต็มที่ไม่ได้ลงชื่อโดยใช้จำนวนเต็มที่ลงนาม) จะถือว่าเป็นขีด จำกัด บนในปี 2038
Devid G

+ เมื่อผ่าน DST จะถูกหัก / เพิ่มอย่างไม่ถูกต้อง
Devid G

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

แนวทางที่สอง

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

หรือคุณสามารถใช้ฟังก์ชัน 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 ต้องการรับค่าผลลัพธ์เป็นวินาทีหรือมิลลิวินาที
Devid G

0

ฟังก์ชันนี้ใช้ความแตกต่างระหว่างวันที่สองวันและแสดงในรูปแบบวันที่ yyyy-mm-dd สิ่งที่คุณต้องใช้คือรันโค้ดด้านล่างจากนั้นใช้ฟังก์ชั่น หลังจากดำเนินการแล้วคุณสามารถใช้งานได้เช่นนี้

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

- ผลลัพธ์: 01:48:00

ตกลงมันไม่ใช่สิ่งที่ OP ถาม แต่เป็นสิ่งที่ฉันต้องการจะทำ :-)


0

รหัสนี้คำนวณความแตกต่างระหว่างวันที่สองวันในรูปแบบ yyyy MM dd

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

ทำไมไม่ใช้TIMESTAMPDIFFฟังก์ชั่นง่ายๆ?
codeforester

0

หากคุณมีวันที่เก็บไว้ในฟิลด์ข้อความเป็นสตริงคุณสามารถใช้รหัสนี้มันจะดึงรายการของจำนวนวันที่ผ่านมาสัปดาห์, เดือนหรือปีเรียงลำดับ:

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 เป็นรูปแบบวันที่ของคุณ

ข้อความค้นหานี้แสดงระเบียนระหว่างวันที่คุณตั้งไว้เช่น: ด้านล่างจาก 7 วันล่าสุดและสูงกว่าจาก 14 วันที่ผ่านมาดังนั้นจึงเป็นระเบียนสัปดาห์สุดท้ายของคุณที่จะแสดงแนวคิดเดียวกันสำหรับเดือนหรือปี มูลค่าใดก็ตามที่คุณระบุไว้ในวันที่ด้านล่างเช่น: ด้านล่างจาก 7 วันดังนั้นค่าอื่น ๆ จะเป็นสองเท่าเป็น 14 วัน สิ่งที่เรากำลังพูดที่นี่ได้รับบันทึกทั้งหมดข้างต้นจาก 14 วันที่ผ่านมาและด้านล่างจาก 7 วันที่ผ่านมา นี่คือบันทึกรายสัปดาห์ที่คุณสามารถเปลี่ยนค่าเป็น 30-60 วันสำหรับเดือนและสำหรับปี

ขอบคุณหวังว่ามันจะช่วยให้ใครบางคน


-1

คุณเพียงแค่ทำสิ่งนี้:

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

5
ระวัง: (สิ้นสุด - เริ่ม) ไม่คืนค่าส่วนต่างระหว่างค่าวันที่และเวลา มันจะคืนค่าตัวเลขที่เป็นความแตกต่างระหว่างตัวเลขทศนิยมที่ดูเหมือน yyyymmddhhmmss
helloPiers

-1

ทำไมไม่เพียงแค่

เลือก Sum (Date1 - Date2) จากตาราง

date1 และ date2 เป็น datetime


สิ่งนี้จะไม่ส่งคืนความแตกต่างวันที่ในไม่กี่วินาที แต่จะคืนค่าความแตกต่างระหว่างตัวเลขทศนิยมที่ดูเหมือน yyyymmddhhmmss ดังนั้นนี่ไม่ได้แก้คำถามของ OP สิ่งเดียวกันถูกกล่าวถึงในความคิดเห็นเกี่ยวกับคำถามเช่นกัน
codeforester
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.