erhalten möchten
Eine grobe Lösung wäre, alle Tage zu generieren und sie dann zu aggregieren (zählen). Es funktioniert, aber es ist grob im Gedächtnis. Wenn es nicht entscheidend ist, würde diese Lösung definitiv funktionieren. Die Alternative besteht darin, eine Monatsserie zu erstellen und einen Tag mit vielen Bedingungen zu vergleichen, wenn die Leistung entscheidend ist.
SELECT
dates.startdate::DATE,
dates.enddate::DATE,
to_char(days.s, 'Mon') AS mon,
to_char(days.s, 'YYYY') AS yr,
count(1) AS d
FROM dates
CROSS JOIN LATERAL (
SELECT * FROM generate_series(dates.startdate, dates.enddate, INTERVAL '1 day') s
) days
GROUP BY 1, 2, 3, 4
Auf jeden Fall hier ist die zweite Variante, die stattdessen durch Monate Schleppen (schneller, härter zu verstehen):
SELECT
dates.startdate::DATE,
dates.enddate::DATE,
to_char(months.startdate, 'Mon') AS mon,
to_char(months.startdate, 'YYYY') AS yr,
least(
months.enddate::DATE - dates.startdate::DATE + 1, -- takes care of first month
dates.enddate::DATE - months.startdate::DATE + 1, -- takes care of last month
months.enddate::DATE - months.startdate::DATE + 1 -- takes care of full months from the middle of the intervals
) AS "days"
FROM dates
-- get months as first day in that month
CROSS JOIN LATERAL (
SELECT * FROM generate_series(
(to_char(dates.startdate, 'YYYY-MM-') || '01')::DATE,
(to_char(dates.enddate + INTERVAL '1 month', 'YYYY-MM-') || '01')::DATE - 1, INTERVAL '1 month') m
) days
-- get months as start date and end date
CROSS JOIN LATERAL (
SELECT
days.m::DATE AS startdate,
(days.m + INTERVAL '1 month')::DATE - 1 AS enddate
) months
Was sollte sein, den "Monat" Wert für z.B. startdatum = 2017-01-01 und enddatum = 2017-06-29? Oder der Jahreswert für startdatum = 2010-04-01 und enddatum = 2017-02-01? –
@a_horse_with_no_name für den ersten Monat Wert sollte Jan, Februar, März, April, Mai, Juni mit den Tagen im Monat einschließlich der Start- und Enddatum sein. und für das zweite Datum Jahr ist 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 mit den Maonths und den Tagen jeweils. – dhS
Bitte fügen Sie einen Kommentar hinzu, bevor Sie eine Anfrage stellen. – dhS