SQLite3:Kalenderansicht des aktuellen Monats

Aus DBWiki
Wechseln zu: Navigation, Suche

Aufgabenstellung

Du willst eine Kalenderansicht des aktuellen Monats geordnet nach Kalenderwochen mit einer Abfrage erstellen.

Lösung

Mit der WITH-Klausel lässt sich in SQLite3 eine rekursive CTE erstellen, um für alle Tage eines Monats deren Monatstag (md), Wochentag (wd) und Kalenderwoche (kw) zu generieren. Das Ergebnis liegt als View actual_month vor. Davon ausgehend lässt sich dann im nächsten Schritt eine Kreuztabellenabfrage, die es in SQLite3 nicht gibt, simulieren.

CREATE VIEW actual_month AS
WITH RECURSIVE DAY (
        x
    )
    AS (
        VALUES (
            DATE('now', 'start of month') 
        )
        UNION ALL
        SELECT DATE(x, '+1 day') 
          FROM DAY
         WHERE x < DATE('now', 'start of month', '+1 month', '-1 day') 
    )
    SELECT strftime('%W', x) AS kw,
           CAST (strftime('%w', x) AS INTEGER) AS wd,
           strftime('%d', x) AS md
      FROM DAY;

Das ist die Zielabfrage:

SELECT KW,
       MIN(CASE wd WHEN 1 THEN md END) AS Mo, -- Kreuztabellenabfrage des armen Manns.
       MIN(CASE wd WHEN 2 THEN md END) AS Di,
       MIN(CASE wd WHEN 3 THEN md END) AS Mi,
       MIN(CASE wd WHEN 4 THEN md END) AS Do,
       MIN(CASE wd WHEN 5 THEN md END) AS Fr,
       MIN(CASE wd WHEN 6 THEN md END) AS Sa,
       MIN(CASE wd WHEN 0 THEN md END) AS So
  FROM actual_month
 GROUP BY KW;

Die Lösung kann hier als dbfiddle eingesehen werden.