Mysql 날짜차이 구하기.. 0 5 775

by 호임 [MySQL] [2021.06.07 15:46:18]


SELECT DATEDIFF(end_date, start_date) FROM test;

안녕하세요 종료일과 시작일의 날짜차이 일수는 DATEDIFF로 하는데 여기서 토요일, 일요일을 어떻게 제외하죠...?

도와주세요!ㅠㅠ

 

by ㅇㅇ준 [2021.06.07 16:31:00]

https://programmer93.tistory.com/45

 

제 블로그는 아니지만 참고하실 수 있겠습니다


by 마농 [2021.06.07 16:42:01]
WITH t AS
(
SELECT DATE '2020-12-29' sdt, DATE '2021-01-05' edt
UNION ALL SELECT DATE '2021-01-01', DATE '2021-01-17'
UNION ALL SELECT DATE '2021-01-03', DATE '2021-01-07'
)
SELECT sdt, edt
     , LENGTH(REPLACE(
       RPAD(
       SUBSTR('0123450', DATE_FORMAT(sdt, '%w') + 1, 7)
       , DATEDIFF(edt, sdt) + 1, '0123450')
       , '0', '')) x
  FROM t
;
-- http://gurubee.net/article/51663

 


by 뉴비디비 [2021.06.08 01:21:57]

제가 직접 여러번 세어봤는데, 아무래도 마농님 결과에 오차가 있는거 같아서 추가 댓글 작성해 봅니다.
그리고 레코드 위치에 따라 RPAD() 가 달라져서 다른 결과가 나오기도 하구요. (비고 및 하단 표 참고)
테스트 했던 DB는 MariaDB 10.3.x 입니다. 
 

WITH t AS
(
		SELECT DATE '2020-12-29' sdt, DATE '2021-01-05' edt
UNION ALL SELECT DATE '2021-01-01', DATE '2021-01-17'
UNION ALL SELECT DATE '2021-01-03', DATE '2021-01-07'
UNION ALL SELECT DATE '2021-06-03', DATE '2021-07-07' -- 주말제외 25일 : 같은일자 다른결과 1
UNION ALL SELECT DATE '2021-06-13', DATE '2021-06-30' -- 주말제외 13일 : 같은일자 다른결과 2
-- 마농님 퀴즈 날짜 예시들 포함
UNION ALL SELECT DATE '2011-01-01', DATE '2011-01-01' 
UNION ALL SELECT DATE '2011-01-02', DATE '2011-01-02' 
UNION ALL SELECT DATE '2011-01-09', DATE '2011-01-15'
UNION ALL SELECT DATE '2011-01-09', DATE '2011-01-16'
UNION ALL SELECT DATE '2011-01-07', DATE '2011-01-08'
UNION ALL SELECT DATE '2011-01-07', DATE '2011-01-09' -- 주말제외 1일
-- 같은 일자 다른 결과 확인 
UNION ALL SELECT DATE '2021-06-03', DATE '2021-07-07' -- 주말제외 25일 : 같은일자 다른결과 1
UNION ALL SELECT DATE '2021-06-13', DATE '2021-06-30' -- 주말제외 13일 : 같은일자 다른결과 2

)

SELECT 
	sdt, edt 
	, ( (DATEDIFF(edt, sdt) + 1) - (scnt + ecnt) ) DIV 7 * 5 + (scnt + ecnt) working_days
	, X "마농님결과"
	, CASE 
		WHEN sdt = '2011-01-07' THEN '주말제외 1일'
		WHEN sdt = '2021-06-03' THEN '주말제외 25일 : 같은일자 다른결과 1 '
		WHEN sdt = '2021-06-13' THEN '주말제외 13일 : 같은일자 다른결과 2 '
	    ELSE ''
	  END "비고"
FROM (
	SELECT sdt, edt 
		, CASE WHEN DATE_FORMAT(sdt, '%w') BETWEEN 1 AND 5 THEN 6 - DATE_FORMAT(sdt, '%w') ELSE 0 END scnt
		, CASE WHEN DATE_FORMAT(edt, '%w') BETWEEN 1 AND 5 THEN DATE_FORMAT(edt, '%w') ELSE 0 END ecnt
		, LENGTH(REPLACE(
			RPAD(
				SUBSTR('0123450', DATE_FORMAT(sdt, '%w') + 1, 7) , DATEDIFF(edt, sdt) + 1, '0123450'
			  )
			, '0', '')
		  ) X
	FROM t
) TTT 
sdt edt working_days 마농님결과 비고
2020-12-29 2021-01-05 6 6  
2021-01-01 2021-01-17 11 11  
2021-01-03 2021-01-07 4 4  
2021-06-03 2021-07-07 25 26 주말제외 25일 : 같은일자 다른결과 1 
2021-06-13 2021-06-30 13 14 주말제외 13일 : 같은일자 다른결과 2 
2011-01-01 2011-01-01 0 0  
2011-01-02 2011-01-02 0 0  
2011-01-09 2011-01-15 5 5  
2011-01-09 2011-01-16 5 5  
2011-01-07 2011-01-08 1 1 주말제외 1일
2011-01-07 2011-01-09 1 2 주말제외 1일
2021-06-03 2021-07-07 25 25 주말제외 25일 : 같은일자 다른결과 1 
2021-06-13 2021-06-30 13 12 주말제외 13일 : 같은일자 다른결과 2 

by 마농 [2021.06.08 11:26:48]

이상하네요.
sdt 2021-06-03(목) 의 경우
SUBSTR 까지의 결과가 450 이나오는데
여기에 RPAD 를 붙이면 450 에 0123450 이 붙는 결과가 나와야 하는데 다른게 나오네요.
정상결과 : 45001234500123450012345001234500123
오류결과 : 40123450012345001234500123450012345
버그 인듯 하네요.


by 뉴비디비 [2021.06.08 21:59:43]

데이터 타입 문제인거 같아요. 문자형으로 처리되는 부분이라 SUBSTR에서 명시적으로 설정하니까 RPAD 결과가 정상으로 나오네요.

, LENGTH(REPLACE(
    RPAD(
        SUBSTR( CAST( '0123450' AS VARCHAR(10) ) , DATE_FORMAT(sdt, '%w') + 1, 7)
       , DATEDIFF(edt, sdt) + 1, '0123450'
    )

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입