{{htmlmetatags>
metatag-description=(달력 쿼리, Calendar Query, 달력, Calendar, 데이터베이스, DBMS, SQL, MySQL, MariaDB, MSSQL, Oracle, Tibero, PostgreSQL)
metatag-og:description=(달력 쿼리, Calendar Query, 달력, Calendar, 데이터베이스, DBMS, SQL, MySQL, MariaDB, MSSQL, Oracle, Tibero, PostgreSQL)
}}
====== Calendar Query ======
최소 지원 버전은 약간의 차이가 있을 수 있습니다.
===== MySQL/MariaDB =====
/*
MySQL 5.0.1 이상/MariaDB 5.1 이상
*/
SELECT
MIN(CASE WHEN week = 1 THEN dt END) AS sun
, MIN(CASE WHEN week = 2 THEN dt END) AS mon
, MIN(CASE WHEN week = 3 THEN dt END) AS tue
, MIN(CASE WHEN week = 4 THEN dt END) AS wed
, MIN(CASE WHEN week = 5 THEN dt END) AS thu
, MIN(CASE WHEN week = 6 THEN dt END) AS fri
, MIN(CASE WHEN week = 7 THEN dt END) AS sat
FROM
(SELECT
WEEK(dt, 0) AS grp
, DAYOFWEEK(dt) AS week
, DATE_FORMAT(dt, '%Y-%m-%d') AS dt
-- , DAYOFMONTH(dt) AS dt
FROM
(SELECT
DATE_ADD(a, INTERVAL b DAY) AS dt
FROM
(SELECT
DATE_ADD(LAST_DAY(NOW() + INTERVAL -1 MONTH), INTERVAL 1 DAY) AS a
-- STR_TO_DATE('20250101', '%Y%m%d') AS a
) a
, (SELECT
0 AS b
UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5
UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
UNION SELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION SELECT 15
UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20
UNION SELECT 21 UNION SELECT 22 UNION SELECT 23 UNION SELECT 24 UNION SELECT 25
UNION SELECT 26 UNION SELECT 27 UNION SELECT 28 UNION SELECT 29 UNION SELECT 30
) b
) cal
WHERE
dt <= LAST_DAY(dt)
) cal
GROUP BY
grp
ORDER BY
grp ASC
;
===== MSSQL =====
/*
MSSQL 2000 이상
*/
SELECT
MIN(CASE WHEN week = 1 THEN dt END) AS sun
, MIN(CASE WHEN week = 2 THEN dt END) AS mon
, MIN(CASE WHEN week = 3 THEN dt END) AS tue
, MIN(CASE WHEN week = 4 THEN dt END) AS wed
, MIN(CASE WHEN week = 5 THEN dt END) AS thu
, MIN(CASE WHEN week = 6 THEN dt END) AS fri
, MIN(CASE WHEN week = 7 THEN dt END) AS sat
FROM
(SELECT
DATEPART(WK, dt) AS grp
, DATEPART(DW, dt) AS week
, CONVERT(CHAR(10), dt, 23) AS dt
-- , DAY(dt) AS dt
FROM
(SELECT
DATEADD(DD, number, CONVERT(VARCHAR(6), GETDATE(), 112) + '01') AS dt
-- DATEADD(DD, number, '20250101') AS dt
FROM
master.dbo.spt_values
WHERE
TYPE = 'P'
AND number <= DATEDIFF(DD
, CONVERT(VARCHAR(6), GETDATE(), 112) + '01'
, CONVERT(VARCHAR(8), DATEADD(DD, -1, DATEADD(MM, 1, CONVERT(VARCHAR(6), GETDATE(), 112) + '01')), 112)
-- , '20250101'
-- , CONVERT(VARCHAR(8), DATEADD(DD, -1, DATEADD(MM, 1, '20250101')), 112)
)
) cal
) cal
GROUP BY
grp
ORDER BY
grp ASC
;
===== Oracle/Tibero =====
/*
Oracle 8i 이상/Tibero 4 이상
*/
SELECT
MIN(DECODE(week, 1, dt)) AS sun
, MIN(DECODE(week, 2, dt)) AS mon
, MIN(DECODE(week, 3, dt)) AS tue
, MIN(DECODE(week, 4, dt)) AS wed
, MIN(DECODE(week, 5, dt)) AS thu
, MIN(DECODE(week, 6, dt)) AS fri
, MIN(DECODE(week, 7, dt)) AS sat
FROM
(SELECT
TRUNC(dt + LEVEL - 1, 'D') AS grp
, TO_CHAR(dt + LEVEL - 1, 'D') AS week
, TO_CHAR(dt + LEVEL - 1, 'YYYY-MM-DD') AS dt
-- , TO_CHAR(dt + LEVEL - 1, 'FMDD') AS dt
FROM
(SELECT
TRUNC(SYSDATE, 'MM') AS dt
-- TO_DATE('20250101') AS dt
FROM
DUAL) cal
CONNECT BY
LEVEL <= (LAST_DAY(dt) - dt + 1)
) cal
GROUP BY
grp
ORDER BY
grp ASC
;
===== PostgreSQL =====
/*
PostgreSQL 8.0 이상
*/
SELECT
MIN(CASE WHEN week = 0 THEN dt END) AS sun
, MIN(CASE WHEN week = 1 THEN dt END) AS mon
, MIN(CASE WHEN week = 2 THEN dt END) AS tue
, MIN(CASE WHEN week = 3 THEN dt END) AS wed
, MIN(CASE WHEN week = 4 THEN dt END) AS thu
, MIN(CASE WHEN week = 5 THEN dt END) AS fri
, MIN(CASE WHEN week = 6 THEN dt END) AS sat
FROM
(SELECT
CASE
WHEN EXTRACT(DOW FROM dt) = 0 THEN DATE_TRUNC('WEEK', dt) + INTERVAL '6 DAY'
ELSE DATE_TRUNC('WEEK', dt) + INTERVAL '-1 DAY'
END AS grp
, EXTRACT(DOW FROM dt) AS week
, TO_CHAR(dt, 'YYYY-MM-DD') AS dt
-- , EXTRACT(DAY FROM dt) AS dt
FROM
(SELECT
CAST(
GENERATE_SERIES(
DATE_TRUNC('MONTH', CURRENT_DATE)
, DATE_TRUNC('MONTH', CURRENT_DATE) + INTERVAL '1 MONTH -1 DAY'
-- DATE_TRUNC('MONTH', CAST('20250101' AS DATE))
-- , DATE_TRUNC('MONTH', CAST('20250101' AS DATE)) + INTERVAL '1 MONTH -1 DAY'
, INTERVAL '1 DAY'
) AS DATE
) AS dt
) cal
) cal
GROUP BY
grp
ORDER BY
grp ASC
;
{{tag>"쿼리" "Query" "응용"}}