T-SQL - ある年月の日付一覧を取得するクエリ
ある年月の日付一覧を取得するクエリを書いてみました。
たとえば、2026年4月の場合は、2026/4/1、2026/4/2、・・・、2026/4/29、2026/4/30という結果を取得したいとします。
月初と月末の日付を取得する
まずは月初と月末の日付は次のように取得できます。日付を指定して取得するクエリと年・月を指定して取得するクエリの2種類。
-- 1. 日付を指定して取得する場合
declare @date date = '2026/04/14';
select
datetrunc(month, @date) as [Beginning],
eomonth(@date) as [End];
/*
Beginning End
---------- ----------
2026-04-01 2026-04-30
*/
-- 2. 年と月を指定して取得する場合
declare @year int = 2026;
declare @month int = 4;
select
datefromparts(@year, @month, 1) as [Beginning],
eomonth(datefromparts(@year, @month, 1)) as [End]
/*
(結果は同じになるので省略)
*/
月初から月末までの日付一覧を取得する
上記をふまえて、月初から月末までの日付を再帰CTEを利用して取得してみます。
-- 1. 日付を指定して取得する場合
declare @date datetime = '2026/04/14';
with Calendar(Date)
as(
select cast(datetrunc(month, @date) as date) as Date
union all
select dateadd(day, 1, Date)
from Calendar
where Date < eomonth(@date)
)
select *
from Calendar;
/*
Date
----------
2026-04-01
2026-04-02
(省略)
2026-04-29
2026-04-30
*/
-- 2. 年と月を指定して取得する場合
declare @year int = 2026;
declare @month int = 4;
with Calendar(Date)
as(
select datefromparts(@year, @month, 1)
union all
select dateadd(day, 1, Date)
from Calendar
where Date < eomonth(datefromparts(@year, @month, 1))
)
select *
from Calendar;
/*
(結果は同じになるので省略)
*/