MySQL에서 두 날짜의 차이점


173

형식에서 두 날짜의 차이를 계산하고 YYYY-MM-DD hh: mm: ss결과를 초 또는 밀리 초로 얻는 방법은 무엇입니까?


14
@didxga :주의 : (종료-시작) 날짜 시간 값 사이의 초 차이를 반환하지 않습니다. yyyymmddhhmmss처럼 보이는 10 진수의 차이 인 숫자를 반환합니다.
— 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

이 솔루션은 저에게 효과적이었습니다! 하지만 제 경우에는 DAYSTAMPDIFF를 DAY에 수행하고 싶지만 주말 (토 / 일)은 고려하지 않습니다. 일주일 차이 만 ... 간단한 방법으로 가능합니까? 그렇지 않다면 불편을 드려 죄송하며 다른 해결책을 찾아 보겠습니다. TK.
— 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는 diff를 일 단위로 리턴하므로). 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 아바

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-유닉스 계열 시스템의 표준 타이밍 방법. 01/01/1970 00:00:00 이후 몇 초가 지 났는지를 나타내는 32 비트 정수를 나타냅니다. 즉, 하한입니다. 상한은 매년 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는 초 또는 밀리 초 단위로 결과 값을 얻으려고합니다.
— 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

OK는 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 일 이후의 모든 기록을 얻습니다. 이것은 한 달 동안 그리고 1 년 동안 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처럼 보이는 10 진수의 차이 인 숫자를 반환합니다.
— helloPiers

-1

왜 그냥

표에서 Sum (Date1-Date2)을 선택하십시오.

date1과 date2는 datetime입니다


날짜 차이를 초 단위로 반환하지 않고 yyyymmddhhmmss와 같은 10 진수의 차이를 반환합니다. 따라서 이것은 OP의 질문을 해결하지 못합니다. 질문에 대한 의견에도 같은 내용이 언급되어 있습니다.
— codeforester
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.