문서의 이전 판입니다!
SELECT
MIN(CASE WHEN week = 1 THEN day END) AS sun
, MIN(CASE WHEN week = 2 THEN day END) AS mon
, MIN(CASE WHEN week = 3 THEN day END) AS tue
, MIN(CASE WHEN week = 4 THEN day END) AS wed
, MIN(CASE WHEN week = 5 THEN day END) AS thu
, MIN(CASE WHEN week = 6 THEN day END) AS fri
, MIN(CASE WHEN week = 7 THEN day END) AS sat
FROM
(SELECT
WEEK(dt, 0) AS grp
, DAYOFWEEK(dt) AS week
, DATE_FORMAT(dt, '%Y-%m-%d') AS day
-- , DAYOFMONTH(dt) AS day
FROM
(SELECT
(a + b) AS dt
FROM
(SELECT
(LAST_DAY(NOW() + INTERVAL -1 MONTH) + INTERVAL 1 DAY) AS a
-- STR_TO_DATE('20251001', '%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
;
SELECT MIN(CASE WHEN week = 1 THEN day END) AS sun , MIN(CASE WHEN week = 2 THEN day END) AS mon , MIN(CASE WHEN week = 3 THEN day END) AS tue , MIN(CASE WHEN week = 4 THEN day END) AS wed , MIN(CASE WHEN week = 5 THEN day END) AS thu , MIN(CASE WHEN week = 6 THEN day END) AS fri , MIN(CASE WHEN week = 7 THEN day END) AS sat FROM (SELECT DATEPART(WK, day) AS grp , DATEPART(DW, day) AS week , day FROM (SELECT CONVERT(CHAR(10), DATEADD(DD, number, CONVERT(VARCHAR(6), GETDATE(), 112) + '01'), 23) AS day -- CONVERT(CHAR(10), DATEADD(DD, number, '20250101'), 23) AS day 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 ;
SELECT
MIN(DECODE(week, 1, day)) AS sun
, MIN(DECODE(week, 2, day)) AS mon
, MIN(DECODE(week, 3, day)) AS tue
, MIN(DECODE(week, 4, day)) AS wed
, MIN(DECODE(week, 5, day)) AS thu
, MIN(DECODE(week, 6, day)) AS fri
, MIN(DECODE(week, 7, day)) 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 day
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
;
SELECT
MIN(CASE WHEN week = 0 THEN day END) AS sun
, MIN(CASE WHEN week = 1 THEN day END) AS mon
, MIN(CASE WHEN week = 2 THEN day END) AS tue
, MIN(CASE WHEN week = 3 THEN day END) AS wed
, MIN(CASE WHEN week = 4 THEN day END) AS thu
, MIN(CASE WHEN week = 5 THEN day END) AS fri
, MIN(CASE WHEN week = 6 THEN day END) AS sat
FROM
(SELECT
CASE
WHEN EXTRACT(DOW FROM day) = 0 THEN DATE_TRUNC('WEEK', day) + INTERVAL '6 DAY'
ELSE DATE_TRUNC('WEEK', day) + INTERVAL '-1 DAY'
END AS grp
, EXTRACT(DOW FROM day) AS week
, day
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 day
) cal
) cal
GROUP BY
grp
ORDER BY
grp ASC
;