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: ss
và để có được kết quả tính bằng giây hoặc mili giây?
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: ss
và để có được kết quả tính bằng giây hoặc mili giây?
Câu trả lời:
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 TIMESTAMPDIFF
cho mục đích của bạn.
TIMEDIFF
bằng 24*60*60
không bằng kết quả của TIMESTAMPDIFF
.
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()
.
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
DATEDIFF
không trả về phân số.
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?
SELECT * FROM table where datediff(today,databasedate) as days =3;
một thứ như thế này
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');
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
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'
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;
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) '
TIMESTAMPDIFF
chức năng?
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 đó.
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
Tại sao không chỉ
Chọn Sum (Date1 - Date2) từ bảng
date1 và date2 là datetime