출처 : OKKY - 너무 신기한 크로스 조인으로 달력 만들기
OKKY - 너무 신기한 크로스 조인으로 달력 만들기
신입 개발자입니다.사내 프로그램에 설정한 날짜(기간)와 검색 조건에 따라 테이블의 컬럼을 가져오는 장문의 sql 쿼리에서 위와 같은서브 쿼리가 있었습니다.설정한 날짜(기간)의 하루하루 달
okky.kr
신입 개발자입니다.
사내 프로그램에 설정한 날짜(기간)와 검색 조건에 따라 테이블의 컬럼을 가져오는 장문의 sql 쿼리에서 위와 같은
서브 쿼리가 있었습니다.
설정한 날짜(기간)의 하루하루 달력을 만들어주는 sql이었는데요. 너무 신기합니다.
이런 크로스 조인 달력 만들기를 검색해 보았는데 수 십 년 전 글들이더군요.
SELECT DATE_FORMAT(dt.yyyymmdd,'%Y-%m-%d') yyyymmdd
FROM (
SELECT LAST_DAY(NOW()) - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS yyyymmdd ,
a.a AS aa ,
b.a AS ba ,
c.a AS ca
FROM (
SELECT 0 AS a
UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 6
UNION ALL
SELECT 7
UNION ALL
SELECT 8
UNION ALL
SELECT 9) AS a
CROSS JOIN
(
SELECT 0 AS a
UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 6
UNION ALL
SELECT 7
UNION ALL
SELECT 8
UNION ALL
SELECT 9) AS b
CROSS JOIN
(
SELECT 0 AS a
UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 6
UNION ALL
SELECT 7
UNION ALL
SELECT 8
UNION ALL
SELECT 9) AS c
) dt
도저히 이해가 안됩니다. cross join을 써본 적이 없어서 이론만 알고 있는데
이런 식으로 사용할 수 있다는 게 너무 놀랍습니다.
똑똑 착한 스마트 개발자분들 이 달력만들기에 담긴 철학을 아신다면
어떻게 이게 가능한 건지 설명을 좀 여쭙고 싶습니다.
답변
(
SELECT 0 AS a
UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 6
UNION ALL
SELECT 7
UNION ALL
SELECT 8
UNION ALL
SELECT 9) AS a
0/1/2/3/4/5/6/7/8/9
이를 crossjoin 시
0|0|0
0|0|1
~~~
9|9|8
9|9|9
이값들을 다시
LAST_DAY(NOW()) - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY
" LAST_DAY(NOW()) " : NOW() 해달월의 마지막날짜
" - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY "
: - (0~9) + (10*0~9) + (100*0~9) day
: - 0 day ~ -999day
최종적으로보면 현재 월의 마지막일자에서 -999일 날짜를 출력하는쿼리로보시면됩니다.
'프로그램개발 > DB(MySQL,MariaDB,MongoDB)' 카테고리의 다른 글
오라클, 오픈소스 마이SQL에 자바스크립트 지원 도입 (0) | 2024.01.05 |
---|---|
PHP에서의 암호화를 MYSQL복호화 방법 (0) | 2023.05.23 |
[MySQL & MariaDB] Alias 별칭 부여시 조건문에서 사용하는 방법 (0) | 2021.04.23 |
MariaDB 튜닝 참고 (0) | 2020.12.15 |
MySQL 원격 접속 허용 (0) | 2020.07.29 |