Logo der ic engineering & research GmbH
Spass mit Datumsberechnungen in Ruby

Spass mit Datumsberechnungen in Ruby

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.

Lösungsansatz 1

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.

Lösungsansatz 2

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!

 

ic engineering & research GmbH
Oberfeldstrasse 120d
CH-8408 Winterthur
Telefon 052 223 13 70