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
"일의 초 차이"란 정확히 무엇을 의미합니까? 결과 곱하여 왜 이해가 안 TIMEDIFF24*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.