Kawałek Kodu

Zdarza się, że z jakiegoś powodu potrzebujesz ciągły zakres rekordów od określonej daty do innej zadanej daty. Czyli zakres potocznie zwany kalendarzem.

Można to osiągnąć na dwa sposoby:

  1. Utworzyć tabelę i zapełnić ją wartościami od 0 do X. A następnie taką tabelę łączyć poprzez CROSS JOIN z zapytaniem wybierającym datę startową i dodawac do daty wartości 0-X.
  2. Wygenerować wartości od 0 do X poprzez zapytanie i połączyć ją analogicznie jak powyżej.

Jak wygląda drugi sposób?

SELECT DATE_ADD(CURDATE(),INTERVAL a.a + (10 * b.a) DAY) FROM
  (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
  CROSS JOIN
  (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2) AS b

Powyższe zapytanie generuje w swoim podzapytaniu liczby z zakresu 0-29 (jak to dokładnie działa, znajdziesz w tym wpisie), następnie łączy każdą z tych liczb z aktualną datą. Oczywiście aktualną datę możesz zastąpić inną datą. Obojętnie jak postąpisz, uzyskasz kalendarz na 30 dni.

A jak rozszerzyć zakres dni, czyli przedłużyć kalendarz? Rozbudować podzapytania. Obecnie drugie podzapytanie ograniczone jest do 2, co daje dwie dziesiątki (20). Możesz je rozerzyć dodając kolejne dziesiątki 3-9. A gdybyś potrzebował kalendarz na więcej niż 100 dni, musisz dodać trzecie podzapytanie dające setki.

Pamiętaj o rocznicy żony/męża!

 

Przydatne linki:
Do pełna poproszę! Czyli array_fill w MySQL(?)
Plaga mrówek, czyli jak zmultiplikować rekordy zapytania