Різниця між двома датами в 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.
Девід Туйте

Це рішення спрацювало на мене! Але в моєму випадку я хотів би виконувати TIMESTAMPDIFF у день, але не враховуючи вихідних (сб / сонце). Я маю на увазі різницю лише в тижні дні ... Чи можливо це по-простому? Якщо ні, я прошу вибачення за незручності, тоді я буду шукати інше рішення. ТЗ.
Масса

8
TIMEDIFF у прикладі невірний, оскільки це не кількість секунд між цими двома днями. TIMEDIFF повертає значення TIME, яке має години, хвилини та секунди різниці. Помноживши це, не дасть корисної відповіді. Використовуйте TIMESTAMPDIFF.
ІванД

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/uk/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не повертає фракції.
Хуан Карлос Оропеза

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-подібних системах. Представляє 32-бітове ціле число, яке вказує, скільки секунд минуло з 01.01.1970 00:00:00. Тобто нижня межа. Верхня межа обмежується 2 106 на рік, але через часті програми не працює з цим значенням (замість непідписаного цілого числа, використовуючи підписане ціле число), вважається верхньою межею в 2038 р.
Девід 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 хоче отримати значення результатів за секунди або мілісекунди.
Девід Г

0

Ця функція приймає різницю між двома датами і показує її у форматі дат гггг-мм-дд. Все, що вам потрібно - це виконати код нижче, а потім скористатися функцією. Після виконання ви можете використовувати його так

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

Гаразд, це не зовсім те, що запитував ОП, але це те, що я хотів зробити :-)


0

Цей код обчислює різницю між двома датами у форматі "yyy 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функцію?
кодовий ліс

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

Чому б не просто

Виберіть суму (дата1 - дата2) з таблиці

date1 та date2 - дата


Це не повертає різницю дат у секундах, натомість повертає різницю між десятковими числами, схожими на yyyymmddhhmmss. Отже, це не вирішує питання ОП. Те ж саме зазначено і в коментарі до питання.
codeforester
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.