Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3623[/thread]

Zeitspannen in Abfrage unterbringen: select von Datum bis Datum



<< >> 3 Einträge, 1 Seite
pktm
 2005-09-24 19:03
#33597 #33597
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Datenbank: MySQL 3.23.51-nt

Ich arbeite zur Zeit an einem kleinen Script namens "AktuellesProgramm" :-)
Dort kann der Benutzer Termine eintragen, die dann automatisch, abhängig vom Datum wann eine Websiete besucht wird, immer aktuell auf einer Webseite präsentiert werden.

Im Administrations-Teil dieses Dinges, wo ich gerade herum frickele soll der Benuter sich die Datenbankeinträge je nach Auswahl anzeigen lassen können. So z.B. alle Termine in den Jahren 2004 und 2005, die in der Zeitspanne Mai bis März, und Dezember statt finden.

Das habe ich bisher so geregelt (hoffe, es ist übersichtlich genug):
Code: (dl )
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
        # wenn nichts angegeben wurde werden die Standard-Werte bemüht
my @monate = @{$defaults{SqlSelectMonate}};
my $jahre = join",",@{$defaults{SqlSelectJahre}};
# Wenn die Anzeigekriterien geändert wurden, also andere Monate oder
# Jahre übergeben wurden, sollten diese benutzt werden
@monate = @{$self->param('SqlSelectMonate')}
if defined $self->param('SqlSelectMonate');
$jahre = join ",",@{$self->param('SqlSelectJahre')}
if defined $self->param('SqlSelectJahre');

# für jeden ausgewählten Monat:
# * Gibt es Einträge deren AnzeigeZeitraumVon || AnzeigeZeitraumBis
# mit diesem Monat zusammen fallen? (=)
# * Gibt es Einträge, deren Anzeigeintervall sich über diesen Monat
# erstreckt? (AZV <= Monat && Monat >= AZB)
my $mk = undef; # mk = monatsklausel
foreach my $m ( @monate ) {
if( defined $mk ) {
# das OR für jedes Element anhängen, aber nicht für das Erste.
$mk .= qq~ OR ~; # mit \w sieht es schöner aus :)
}
$mk .= qq~
(
MONTH( AnzeigeZeitraumVon ) <= $m
AND
MONTH( AnzeigeZeitraumBis ) >= $m
)
~;
}

my $sql = qq~
SELECT
ID,
AnnounceCaption,
DATE_FORMAT(AnzeigeZeitraumVon,'%d%.%m%.%Y')
AS AnzeigeZeitraumVon,
DATE_FORMAT(AnzeigeZeitraumBis,'%d%.%m%.%Y')
AS AnzeigeZeitraumBis
FROM `ap`
WHERE
YEAR(AnzeigeZeitraumBis) IN($jahre)
AND
(
$mk
)
ORDER BY AnzeigeZeitraumVon DESC
LIMIT $offset, $max
~;


Die Auswahlmöglichkeit ist ganz einfach durch Checkboxen für alle in der DB vorhandenen Jahre und alle 12 Monate gegeben.

Das funktioniert soweit ganz gut.
ABER: Wenn der Benutzer einen Termin eingegeben hat, der sich über 2 Jahre erstreckt, z.B. ein Termin von Weihnachten bis Neujahr, so wird dieser nicht angezeigt.

Hat da jemand zufällig einen Tipp, wie ich das hinbekomme?
Irgendwelche mir bislang unbekannten Datums-Select-Funktionen? Event. Codeschnipsel?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Strat
 2005-09-24 19:55
#33598 #33598
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn du schreibst:
Code: (dl )
1
2
3
4
DATE_FORMAT(AnzeigeZeitraumVon,'%d%.%m%.%Y')
AS AnzeigeZeitraumVon,
...
ORDER BY AnzeigeZeitraumVon DESC

dann wird nach der formatierten ausgabe sortiert, nicht nach dem datum selbst; da besser einen anderen Namen fuer das formatierte feld verwenden:
Code: (dl )
1
2
3
4
DATE_FORMAT(AnzeigeZeitraumVon,'%d%.%m%.%Y')
AS AnzeigeZeitraumVonFormatted,
...
ORDER BY AnzeigeZeitraumVon DESC

dann hast du das formatierte Datum in AnzeigeZeitraumVonFormatted, und die Sortierung geht nach datum (vorausgesetzt, AnzeigeZeitraumVon ist datetime oder aehnlich)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pktm
 2005-09-25 14:55
#33599 #33599
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
[quote=Strat,24.09.2005, 17:55]wenn du schreibst:
Code: (dl )
1
2
3
4
DATE_FORMAT(AnzeigeZeitraumVon,'%d%.%m%.%Y')
                AS AnzeigeZeitraumVon,
...
ORDER BY AnzeigeZeitraumVon DESC

dann wird nach der formatierten ausgabe sortiert, nicht nach dem datum selbst; da besser einen anderen Namen fuer das formatierte feld verwenden:
Code: (dl )
1
2
3
4
DATE_FORMAT(AnzeigeZeitraumVon,'%d%.%m%.%Y')
                AS AnzeigeZeitraumVonFormatted,
...
ORDER BY AnzeigeZeitraumVon DESC

dann hast du das formatierte Datum in AnzeigeZeitraumVonFormatted, und die Sortierung geht nach datum (vorausgesetzt, AnzeigeZeitraumVon ist datetime oder aehnlich)[/quote]
Habs geändert. Da ich nur eine kleine Anzahl Ergebnisse hatte ist es mir auf anhieb nicht aufgefallen.
Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
<< >> 3 Einträge, 1 Seite



View all threads created 2005-09-24 19:03.