จะคำนวณความแตกต่างระหว่างวันที่สองวันในรูปแบบYYYY-MM-DD hh: mm: ss
และรับผลลัพธ์เป็นวินาทีหรือมิลลิวินาทีได้อย่างไร
จะคำนวณความแตกต่างระหว่างวันที่สองวันในรูปแบบYYYY-MM-DD hh: mm: ss
และรับผลลัพธ์เป็นวินาทีหรือมิลลิวินาทีได้อย่างไร
คำตอบ:
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
เพื่อวัตถุประสงค์ของคุณ
TIMEDIFF
โดยไม่เท่ากับผลมาจากการ24*60*60
TIMESTAMPDIFF
TIMEDIFF()
คาดว่าข้อโต้แย้งเวลาเริ่มต้นและเวลาสิ้นสุดจะอยู่ในลำดับตรงกันข้ามกับที่คาดTIMESTAMPDIFF()
ไว้
หากคุณทำงานกับคอลัมน์ 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
DATEDIFF
ไม่คืนเศษส่วน
รับผลต่างวันในหน่วยวันโดยใช้ 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;
เช่นนี้
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')
select
unix_timestamp('2007-12-30 00:00:00') -
unix_timestamp('2007-11-30 00:00:00');
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
หรือคุณสามารถใช้ฟังก์ชัน 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'
ฟังก์ชันนี้ใช้ความแตกต่างระหว่างวันที่สองวันและแสดงในรูปแบบวันที่ 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;
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 ถาม แต่เป็นสิ่งที่ฉันต้องการจะทำ :-)
รหัสนี้คำนวณความแตกต่างระหว่างวันที่สองวันในรูปแบบ 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
ฟังก์ชั่นง่ายๆ?
หากคุณมีวันที่เก็บไว้ในฟิลด์ข้อความเป็นสตริงคุณสามารถใช้รหัสนี้มันจะดึงรายการของจำนวนวันที่ผ่านมาสัปดาห์, เดือนหรือปีเรียงลำดับ:
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 วันสำหรับเดือนและสำหรับปี
ขอบคุณหวังว่ามันจะช่วยให้ใครบางคน
คุณเพียงแค่ทำสิ่งนี้:
SELECT (end_time - start_time) FROM t; -- return in Millisecond
SELECT (end_time - start_time)/1000 FROM t; -- return in Second
ทำไมไม่เพียงแค่
เลือก Sum (Date1 - Date2) จากตาราง
date1 และ date2 เป็น datetime