Bei einem Projekt stellte sich de Aufgabe, für jeden Monat des aktuellen Jahres eine Auswertung der SQL-Datenbank zu machen. Das gewünschte SQL-Statement sollte am Schluss etwa wie folgt aussehen:
SELECT * FROM tblEntries WHERE created_at >= "2007-01-01" AND created_at <= "2007-01-31"
Natürlich sollte das für jeden Monat des Jahres automatisiert erfolgen. Aus diesem Grund mussten wr uns näher mit den Datumsberechungsfunktionen von Ruby befassen.
Die erste und naheliegende Idee war folgende:
@month_start = Time.local(Time.new.year, 1, 1) @month_end = @month_start + 1.month
Sieht doch nett und einfach aus, oder??? Leider ergab sich dann beim Testen, dass z.B. für Februar statt dem erwarteten Ende "2007-02-28" das Datum "2007-03-03" ergab. Ruby addiert demzufolge einfach stur 31 Tage zum angegebene Datum, egal wieviele Tage der entsprechende Monat hat. Damit ist dieses nette Feature leider nicht brauchbar für unsere Zwecke.
Da ja die "einfache" Variante nicht wie erwartet funktionert, mussten wir uns wie folgt behelfen:
@month_start = Time.local(Time.new.year, 1, 1) @month_end = Time.local(Time.new.year, 2, 1) - 1.day
Wir nehmen also für das Ende den ersten Tag des Folgemonats und subtrahieren einen Tag.
Voilà - nun funktioniert es we gewünscht!