2011-10-28T18:38:17 rostiWas Deine DB-Abfrage betrifft: Guck mal, ob Du das nicht schon auf der Engine machen kannst, da gibt es einige Datumsfunktionen.
2011-10-28T18:39:59 bianca2011-10-28T18:38:17 rostiWas Deine DB-Abfrage betrifft: Guck mal, ob Du das nicht schon auf der Engine machen kannst, da gibt es einige Datumsfunktionen.
Keine DB. Daten werden aus Datei geladen und sind eh schon komplett im RAM in einem Hash.
2011-10-28T18:45:54 rostiNa, umso besser ;)
Noch besser ists, wenn das Datum als numerischer Wert (Julianischer Tag) vorliegt, damit kannst Du vorzüglich operieren.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
sub _julianday{ my ($day, $month, $year) = @_; my ($jd, $a, $y, $m) = (); if($year < 0){ $year++; } $a = (14 - $month)/12; $y = $year + 4800 - $a; $m = $month + 12 * $a - 3; # zunaechst gregorianisch rechnen, ist jd < 2299160 (4.10.1582), wird julianisch gerechnet $jd = $day + ((153 * $m + 2)/5) + 365 * $y + ($y/4) - ($y/100) + ($y/400) - 32045; # hier wird julianisch gerechnet if( $jd < 2299160 ){ $jd = $day + ((153 * $m +2)/5) + 365 * $y + ($y/4) - 32083; } return $jd; } sub _julianday_to_date{ my $jd = shift; # Gregorian, common my $a = $jd + 32044; my $b = ( ( $a * 4 + 3)/146097); my $c = $a - (146097 * $b/4); my $gregorian = 1; # Pruefe auf Julian if($jd <= 2299160){ $b = 0; $c = $jd + 32082; $gregorian = 0; } my $d = ((4 * $c + 3)/1461); my $e = $c - ((1461 * $d)/4); my $m = (($e * 5 + 2)/153); my $day = $e - ((153 * $m +2)/5) + 1; my $month = $m + 3 - ($m/10) * 12; my $year = 100 * $b + $d - 4800 + ($m/10); if($year < 0){ $year--; } if($year == 0){ $year = -1; } return ($day, $month, $year, $gregorian); }
2011-10-28T18:50:14 GwenDragonDu kannst ja mal mit Devel::Size "ausmessen" wie groß deine Deatenstruktur würde mit den Datumsinhalten im Array, falls du Angst vor Speicherengpässen hast.
2011-10-28T18:09:03 biancaGuten Abend!
Habe hier eine Datenbasis und möchte da etwas auswerten.
Die Daten finde ich darin jeweils unter dem Tagesdatum als Variablenname.
Die Logik macht es erforderlich, dass ich erst vom aktuellen Tagesdatum ausgehend "rückwärts" nach vorhandenen Tagen suche und danach ab einem bestimmten Datum wieder "vorwärts" gehe, um Daten zu summieren.
Die Rückwärtssuche mache ich mit Add_Delta_YMD (@akt_tag,0,0,-1) aus dem Modul Date::Calc zwecks Ermittlung der einzelnen Namen.
QuoteDas lässt darauf schließen, dass du das Startdatum von vorn herein kennst. Kannst du dann nicht gleich nach dem Startdatum suchen (vorwärts oder rückwärts)? Wenn du bei der Suche große Strecken zurücklegen musst, kannst du statt in Einzelschritten auch die Schrittweite in einer Fibonacci-Folge erhöhen. Das soll für solche Aufgaben eine gute Strategie sein.... ab einem bestimmten Datum