営業日・祝日を SQL で扱う
mart_calendar は1955年から数年先までの1日1行のカレンダーで、祝日・振替休日・曜日・年度・和暦のフラグを持ちます。「今月の営業日数」「次の営業日」のような業務ロジックが JOIN 1つで書けます。
mart_calendar は1955年から数年先までの1日1行のカレンダーで、祝日・振替休日・曜日・年度・和暦のフラグを持ちます。「今月の営業日数」「次の営業日」のような業務ロジックが JOIN 1つで書けます。
営業日判定は is_weekday を使う
is_weekday は「土日でも祝日でもない平日」を表します。振替休日や、祝日に挟まれた国民の休日は holiday_name が付かないため、is_holiday だけで判定すると営業日扱いにしてしまいます。2026年5月の連休明けで違いを確認できます。
SELECT date, weekday, is_holiday, holiday_name, is_weekday
FROM calendar.main.mart_calendar
WHERE date BETWEEN DATE '2026-05-03' AND DATE '2026-05-07'
ORDER BY date
5月6日(水)は振替休日のため is_holiday は false でも is_weekday は false です。営業日のカウントには is_weekday を使ってください。
今月の営業日数
SELECT COUNT(*) FILTER (is_weekday) AS business_days
FROM calendar.main.mart_calendar
WHERE year = year(CURRENT_DATE) AND month = month(CURRENT_DATE)
次の営業日・N営業日後
「次の営業日」は今日より後の最初の平日です。
SELECT MIN(date) AS next_business_day
FROM calendar.main.mart_calendar
WHERE date > CURRENT_DATE AND is_weekday
「5営業日後」のような期限計算は LIMIT と OFFSET で書けます。
SELECT date AS due_date
FROM calendar.main.mart_calendar
WHERE date > CURRENT_DATE AND is_weekday
ORDER BY date
LIMIT 1 OFFSET 4
月別の営業日数と祝日数
年間の営業日カレンダーを一覧にします。売上目標の月割りや稼働計画の分母に使えます。
SELECT
month,
COUNT(*) FILTER (is_weekday) AS business_days,
COUNT(*) FILTER (is_holiday) AS holidays
FROM calendar.main.mart_calendar
WHERE year = 2026
GROUP BY month
ORDER BY month
年度・四半期・和暦
会計年度(4月始まり)と四半期、和暦のラベルも1行に揃っています。日付を年度で集計し直すときに便利です。
SELECT date, fiscal_year, fiscal_quarter, wareki_label
FROM calendar.main.mart_calendar
WHERE date = CURRENT_DATE
手元の売上データに営業日フラグを付ける
日付列を持つ CSV を手元の DuckDB で読み込めば、営業日あたりの売上のような指標がすぐ出せます(接続方法はDuckDB CLI からの接続を参照)。
CREATE TABLE sales AS FROM read_csv('sales.csv'); -- date, amount 列を持つ想定
SELECT
c.year,
c.month,
SUM(s.amount) AS total,
SUM(s.amount) / COUNT(DISTINCT c.date) FILTER (c.is_weekday) AS per_business_day
FROM sales s
JOIN calendar.main.mart_calendar c ON s.date = c.date
GROUP BY ALL
ORDER BY c.year, c.month;
このレシピの SQL は Queria のデータセットページ上でそのまま実行できます。
