2022-11-25, 2022-11-26, 2022-11-27, 2022-11-30
11월 25일부터 30일까지 27일까지는 연속으로 날자가 있고 28~29일까지는 날자가 없습니다 저장된 데이터가 없는 날인데요
SELECT
DISTINCT DATE(w1.close_date) + INTERVAL 1 DAY AS missing_date
FROM
check w1
LEFT JOIN
(SELECT DISTINCT close_date FROM check ) w2 ON DATE(w1.close_date) = DATE(w2.close_date) - INTERVAL 1 DAY
WHERE
w1.close_date BETWEEN '2022-11-20' and '2022-11-30'
AND
w2.close_date IS NULL;
이렇게 하면 11-28과 12월01이 나오는데요
원하는 값은 11-28,11-29일을 조회 하는 쿼리를 작성하고 싶은데 저기서 어떻게 수정해야 할까요?
WITH RECURSIVE calendar_t AS
(
SELECT '2022-11-20' dt
UNION ALL
SELECT dt + INTERVAL 1 DAY
FROM calendar_t
WHERE dt < '2022-11-30'
)
, check_t AS
(
SELECT '2022-11-20' close_date
UNION ALL SELECT '2022-11-20'
UNION ALL SELECT '2022-11-21'
UNION ALL SELECT '2022-11-22'
UNION ALL SELECT '2022-11-23'
UNION ALL SELECT '2022-11-24'
UNION ALL SELECT '2022-11-25'
UNION ALL SELECT '2022-11-26'
UNION ALL SELECT '2022-11-27'
UNION ALL SELECT '2022-11-30'
)
SELECT a.dt
FROM calendar_t a
LEFT OUTER JOIN check_t b
ON a.dt = b.close_date
WHERE b.close_date IS NULL
;
MySQL 5.7.12 버전사용중입니다
MySQL server version for the right syntax to use near 'RECURSIVE calendar_t
mysql 버전이 낮아서 안되는거 같습니다 ㅜㅡㅜ
만약 된다면 union all은 하나씩 넣어줘야 하는건가요?
1. 달력테이블을 미리 만들어서 사용하시면 편리합니다.
2. MySQL 달력 만들기
3. UNION 한 것은 테스트용도로 만든 것일 뿐입니다. 실테이블 사용하시면 됩니다.
달력테이블 별도로 미리 만들어 두시고
실제 테이블과 달력테이블을 조인하여 사용하시면 됩니다.
SELECT a.dt
FROM calendar_t a
LEFT OUTER JOIN check_t b
ON a.dt = b.close_date
WHERE a.dt BETWEEN '2022-11-20' AND '2022-11-30'
AND b.close_date IS NULL
;