[GastForen Archiv Perl und CGI Zeitabhänige Anzeige

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Archiv - Archivierte Foren
Themen
Beiträge
Moderatoren
Letzter Beitrag

Zeitabhänige Anzeige

trueprojects
Beiträge gesamt:

25. Okt 2005, 00:17
Beitrag # 1 von 29
Bewertung:
(9583 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo mal wieder. Ich hab da ein Problem... ;)

Damit jeder folgen kann mal stark vereinfacht:

Ich habe eine Tabelle in einer SQL-Datenbank mit 2 "Spalten" bzw. Feldern. Eines (datetime) enthält Datum und Uhrzeit, das andere ein Ereigniss (Text). Für jeden Tag gibt es mehrere Einträge/Ereignisse mit verschiedenen Uhrzeiten.

Ich möchte nun auf einer Seite immer die Ereignisse anzeigen, die am aktuellen Tag (also heute) z.B. zwischen 16 und 17 Uhr stattfinden. Vom Prinzip her wie ein kleiner Kalender.

Mir fehlt hauptsächlich die Bedingung:

Lies aus der Tabelle die Einträge mit dem heutigen Datum und der Uhrzeit zwischen 16 und 17 Uhr aus und zeige mir die Ereignisse chronologisch untereinander an, z.B. so:

16.05 Musterereignis Alpha
16.15 Musterereignis Beta
16:45 Muster... usw.

Für eure Hilfe wäre ich euch sehr dankbar! Viele liebe Grüße
trueprojects (ehemals Hanü :)

P.S. Die Tabelle enthält "Termine" über den ganzen Tag verteilt, ich möchte aber explizip nur einen bestimmten Zeitraum des aktuellen Tages anzeigen

(Dieser Beitrag wurde von trueprojects am 25. Okt 2005, 00:20 geändert)
X

Zeitabhänige Anzeige

SabineP
Beiträge gesamt: 7586

25. Okt 2005, 10:38
Beitrag # 2 von 29
Beitrag ID: #192432
Bewertung:
(9573 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hanü,

Du kannst die Daten mit einer SQL-Abfrage aus der Datenbank selektieren und sortieren.

select datum, ereignis FROM kalender
WHERE datum BETWEEN
(interval 16 hour + current_date) AND (interval 17 hour + current_date)
ORDER BY datum


und noch ein Beispielscript:

Code
 
#!/usr/bin/perl
# Einbinden der Module
use CGI::Carp qw(fatalsToBrowser);
use strict;
use CGI qw(-no_xhtml);
use DBI;

# Verbindung zur Datenbank herstellen
my $db=DBI->connect('dbi:mysql:Datenbank;localhost','Benutzer','Passwort');
my $http=new CGI;

my $von_stunde='16';
my $bis_stunde='17';

# HTTP-Header ausgeben
print $http->header();
print $http->start_html();

my $query = $db->prepare("select datum, ereignis FROM kalender WHERE datum BETWEEN (interval ? hour + current_date) AND (interval ? hour + current_date) ORDER BY datum");

print $db->errstr; #Errorstring
$query->execute($von_stunde, $bis_stunde);


while(my @zeile = $query->fetchrow_array){
print $zeile[0], $zeile[1], "<br>\n";
}


# Datenbank-Verbindung beenden
$db->disconnect();

# HTML-Dokument beenden
print $http->end_html();


Gruß Sabine


als Antwort auf: [#192403]
(Dieser Beitrag wurde von SabineP am 25. Okt 2005, 11:04 geändert)

Zeitabhänige Anzeige

trueprojects
Beiträge gesamt:

25. Okt 2005, 22:30
Beitrag # 3 von 29
Beitrag ID: #192591
Bewertung:
(9562 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Super, danke! Hat mir echt viel geholfen! Auf dich ist doch immer verlass!


als Antwort auf: [#192403]

Zeitabhänige Anzeige

trueprojects
Beiträge gesamt:

25. Okt 2005, 22:39
Beitrag # 4 von 29
Beitrag ID: #192592
Bewertung:
(9560 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Kommt aber gleich die nächst Frage dazu: Wie kann ich nur die Uhrzeit im Format h:m, also z.B. 11.00 auslesen? Im Moment bekomme ich ja den kompletten Wert in der Form 2005-10-25 11:00:00 in der HTML-Seite zurück...

my $uhrzeit = $db->prepare("select hour, min FROM datum...

Herzlichen Dank!


als Antwort auf: [#192432]

Zeitabhänige Anzeige

trueprojects
Beiträge gesamt:

26. Okt 2005, 17:17
Beitrag # 5 von 29
Beitrag ID: #192773
Bewertung:
(9549 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Habe inzwischen nochmal selbst recherchiert und bin inzwischen auf folgenden Befehl gestoßen:

extract HOUR_MINUTE from Datum

jetzt versteh ich nur noch nicht so ganz, wo und wie ich diesen Befehl einbauen muss?

Gruß Hanü


als Antwort auf: [#192403]

Zeitabhänige Anzeige

SabineP
Beiträge gesamt: 7586

26. Okt 2005, 17:42
Beitrag # 6 von 29
Beitrag ID: #192783
Bewertung:
(9546 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Das macht man normalerweise immer mit DATE_FORMAT, also müßte die Select-Anweisung so aussehen:

my $query = $db->prepare("select DATE_FORMAT(datum, '%H:%i'), ereignis FROM kalender WHERE datum BETWEEN (interval ? hour + current_date) AND (interval ? hour + current_date) ORDER BY datum");

http://dev.mysql.com/...-time-functions.html

DATE_FORMAT(datum,format)

Formatiert den datum-Wert gemäß der format-Zeichenkette. Folgende Spezifikatoren können in der format-Zeichenkette benutzt werden: ...
Schau Dir mal die hier folgende Tabelle an.

Gruß Sabine


als Antwort auf: [#192773]
(Dieser Beitrag wurde von SabineP am 26. Okt 2005, 17:43 geändert)

Zeitabhänige Anzeige

trueprojects
Beiträge gesamt:

5. Nov 2005, 03:07
Beitrag # 7 von 29
Beitrag ID: #194349
Bewertung:
(9530 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Das konnte ich so lösen, auch wenn ich inzwischen mehrere Umwege gegangen bin. Aber dein Link hat mir sehr geholfen. Ich habe eine weitere Frage :)

Wir haben ja hier im Forum mal das Datum mit Perl ermittelt:
http://www.hilfdirselbst.ch/...cgi?post=14804#14804

Jetzt will ich das erweitern... Und zwar versuche ich gerade ein Formular mit einem <select> Element zu machen, in dem man ein Datum auswählen kann. An sich nichts besonderes - wenn man es regelmäßig manuel ändert, denn ich hätte gerne immer nur einen bestimmten Wochentag pro Woche - und genau diese Aufgabe würde ich gerne mit Perl lösen.

Das Select-Feld wird also von Perl erzeugt und mit SSI eingebunden, und ich sehe immer nur z.B. den Sonntag dieser Woche, den der letzten, der nächsten und übernächsten Woche (oder so ähnlich - also 4-6 Termine im Format "Sonntag, 06. November 2005").

Bitte gebt mir mal einen kleinen Denkanstoß, mit welchem Befehl ich das machen kann (wären alle Daten in einer SQL-DB würde ich es mit SELECT versuchen... gibt es sowas in Perl? Ich hab jetzt schon eine Weile gesucht, aber nichts passendes gefunden. Oder macht man sowas doch mit einfachen Schleifen und Bedingungen?)

Aber macht euch bitte nicht die Mühe ein ganzes Script zu schreiben, denn ich möchte versuchen, den Befehl bzw. die Anweisung selbst in mein Script einzubauen. Hat jemand einen guten Tip? DANKE!

Viele liebe Grüße, Hanü


als Antwort auf: [#192783]

Zeitabhänige Anzeige

oesi50
  
Beiträge gesamt: 2315

5. Nov 2005, 11:13
Beitrag # 8 von 29
Beitrag ID: #194365
Bewertung:
(9520 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
hallo hanü,

hier mal eine Anregung:
Code
#!/usr/bin/perl 

my $tag = 86400;

my $heute = time;

my $wtag = (localtime($heute))[6];

my $korrektur = $wtag ? (7 - $wtag) : 0;
print "vorvorige Woche : ", scalar localtime($heute + $korrektur*$tag - 14*$tag), "\n";
print "vorige Woche : ", scalar localtime($heute + $korrektur*$tag - 7*$tag), "\n";
print "Aktuell : ", scalar localtime($heute + $korrektur*$tag), "\n";
print "nächste Woche : ", scalar localtime($heute + $korrektur*$tag + 7*$tag), "\n";
print "übernächste Woche : ", scalar localtime($heute + $korrektur*$tag + 14*$tag), "\n";



als Antwort auf: [#194349]
(Dieser Beitrag wurde von oesi50 am 5. Nov 2005, 11:14 geändert)

Zeitabhänige Anzeige

trueprojects
Beiträge gesamt:

6. Nov 2005, 02:32
Beitrag # 9 von 29
Beitrag ID: #194434
Bewertung:
(9510 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi Oesi,

ich versteh nicht genau, wie du auf diese beiden Angaben kommst:
my $tag = 86400; und [6] bei localtime. Was genau bezwecken diese? Liege ich hiermit richtig:

86400 sind die Sekunden eines Tages (60sec. x 60min x 24h)
Ist [6] der Wert "Wochentag" in dem localtime-Attribut?

Bei deinem Script wird doch aber immer vom aktuellen Tag ausgegangen, nicht von einem bestimmten. Oder lieg ich daneben?

Wenn ich deinen Code richtig verstehe erhalte ich eine Liste mit dem heutigen Datum dem selben Wochentag vor und in 14 Tagen.

Aber mein Problem ist vielmehr, dass ich jederzeit, egal ob ich das Script Montags oder Freitags aufrufe, immer z.B. die Sonntags-Termine innerhalb eines bestimmten - aktuellen - Zeitraumes erhalte (bei deinem Script hieße das im aktuellen Falle: ich rufe es am Dienstag [z.B. 08.11.] auf und erhalte als Ergebnis z.B. den 6.11., 13.11., 20.11., 27.11. oder so. Genauso wenn ich es am Freitag aufrufe. Am Montag drauf würde sich die Anzeige ändern und um eine Woche verschieben, so bleibt die Auswahl aktuell)

Dein Tipp war aber schon nah dran denke ich, vielen Dank dafür! Oder hab ich dein Script doch nicht so ganz verstanden? Ich bin mir gerade nicht mehr so ganz sicher...


als Antwort auf: [#194365]
(Dieser Beitrag wurde von trueprojects am 6. Nov 2005, 02:36 geändert)

Re: Zeitabhänige Anzeige

oesi50
  
Beiträge gesamt: 2315

6. Nov 2005, 09:07
Beitrag # 10 von 29
Beitrag ID: #194438
Bewertung:
(9505 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
 

Hallo Hanü,


> ich versteh nicht genau, wie du auf diese beiden Angaben kommst:
> my $tag = 86400; und [6] bei localtime. Was genau bezwecken diese? Liege ich hiermit richtig:
Ja

> 86400 sind die Sekunden eines Tages (60sec. x 60min x 24h)
> Ist [6] der Wert "Wochentag" in dem localtime-Attribut?
Ja

> Bei deinem Script wird doch aber immer vom aktuellen Tag ausgegangen, nicht von einem bestimmten.

Ja

> Wenn ich deinen Code richtig verstehe erhalte ich eine Liste mit dem heutigen Datum dem selben Wochentag vor und in 14 Tagen.

Ja

> Aber mein Problem ist vielmehr, dass ich jederzeit, egal ob ich das Script Montags oder Freitags aufrufe, immer z.B. die Sonntags-Termine innerhalb eines bestimmten - aktuellen - Zeitraumes erhalte (bei deinem Script hieße das im aktuellen Falle: ich rufe es am Dienstag [z.B. 08.11.] auf und erhalte als Ergebnis z.B. den 6.11., 13.11., 20.11., 27.11. oder so. Genauso wenn ich es am Freitag aufrufe. Am Montag drauf würde sich die Anzeige ändern und um eine Woche verschieben, so bleibt die Auswahl aktuell)

Aber genau so geht der Code ja.

Für ein beliebiges Datum verwende:

use Time::Local

$heute = timelocal($sekunde,$minute,$stunden,$tag,$monat,$jahr);


Grüße
Oesi




als Antwort auf: [#194434]

Re: Zeitabhänige Anzeige

trueprojects
Beiträge gesamt:

6. Nov 2005, 23:53
Beitrag # 11 von 29
Beitrag ID: #194551
Bewertung:
(9496 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Sorry Oesi, aber ich steig da nicht ganz durch. Habe jetzt mit deinem Script länger rumexperimentiert, aber es kommen immer mehr Fragen auf, anstelle dass es klarer wird...

Meines Wissens sind folgende Daten in "localtime(time)" in dieser Reihenfolge gespeichert:
Sekunden, Minuten, Stunden, Monatstag, Monat, Jahr, Wochentag, Jahrestag, Sommerzeit

In deinem Script gibst du an
Code
my $wtag = (localtime($heute))[6]; 


Der Wert [6], also die 6. Stelle, ist doch aber das Jahr, und nicht der Wochentag!?

Wenn ich dein Script so wie es ist ausführe, erhalte ich folgendes Ergebnis:
- Mon Oct 24 00:38:35 2005
- Sun Oct 30 23:38:35 2005
- Sun Nov 6 23:38:35 2005
- Sun Nov 13 23:38:35 2005
- Sun Nov 20 23:38:35 2005

Warum ist da ein Montag dabei? Ich habe Testweise mal folgenden Code verändert:
Code
my $korrektur = $wtag ? (7 - $wtag) : 0; 
in
my $korrektur = $wtag ? (3 - $wtag) : 0;

-> es ist nichts passiert.

Ändere ich den Code aber so:
Code
my $wtag = (localtime($heute))[7];  
my $korrektur = $wtag ? (5 - $wtag) : 0;

erhalte ich als Ergebnis zwar einen anderen Wochentag, aber beachte mal das Datum:
- Thu Dec 23 23:43:20 2004
- Thu Dec 30 23:43:20 2004
- Thu Jan 6 23:43:20 2005
- Thu Jan 13 23:43:20 2005
- Thu Jan 20 23:43:20 2005
Wie kommt der darauf?

Ich habe es vom Ansatz her mal so angegangen (neues Script]:

Code
#!/usr/bin/perl -w 
use CGI::Carp qw(fatalsToBrowser);
use CGI;
use strict;

my (undef, undef, undef, $Monatstag, $Monat, $Jahr, $Wochentag, undef, undef) = localtime(time);

$Monat+=1;
$Monat = $Monat < 10 ? $Monat = "0".$Monat : $Monat;
$Monatstag = $Monatstag < 10 ? $Monatstag = "0".$Monatstag : $Monatstag;
$Jahr+=1900;

my @Wochentage = ("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
my @Monatsnamen = ("", "Januar", "Februar", "M&auml;rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");

print "Content-type: text/html\n\n";
print "$Wochentage[$Wochentag], $Monatstag.$Monat.$Jahr<br>\n";


Damit erhalte ich ja das aktuelle Datum. Nur wie bekomme ich daraus z.B. den letzten und nächsten Donnerstag? Oder den vorletzten und übernächstem Mittwoch? Ich kapier das einfach nicht.

Ich habe einen Wert $Wochentag der mir sagt, ob Montag oder Freitag ist. Der ändert sich täglich. Ich will aber als Ergebnis immer nur einen bestimmten Tag der letzten Woche.
Mache ich 7-$Wochentag wäre das Ergebnis bei $Wochentag=3=Mittwoch >4<, also Donnerstag. Mache ich aber das gleiche an einem Freitag wäre die Rechnung 7-5=2 also Dienstag. Ich brauche doch aber z.B. den Donnerstag.

Verstehst du was ich meine? Ich erhalte zwar Werte aus den letzten oder folgenden 7, 14 oder mehr Tagen, aber immer für einen wechselnden Wochentag, entsprechend dem aktuellen. Ich brauche aber immer den Wert für einen BESTIMMTEN Wochentag, unabhängig davon, wann ich das Script ausführe.

Ich mach es wahrscheinlich komplizierter als es ist?
Gruß und Danke!


als Antwort auf: [#194438]

Re: Zeitabhänige Anzeige

oesi50
  
Beiträge gesamt: 2315

7. Nov 2005, 09:13
Beitrag # 12 von 29
Beitrag ID: #194572
Bewertung:
(9486 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
probier's mal so:

Code
#!/usr/bin/perl 


$wochentag = 3; # 0:So 1:Mo 2:Di 3:Mi 4:Do 5:Fr 6:Sa

my $tag = 86400;
my $heute = time;
$heute = $heute - $heute % $tag + $tag / 2;
my $wtag = (localtime($heute))[6];
my $korrektur = ($wtag ? (7 - $wtag) : 0) + $wochentag;

print "vorvorige Woche : ", scalar localtime($heute + $korrektur*$tag - 14*$tag), "\n";
print "vorige Woche : ", scalar localtime($heute + $korrektur*$tag - 7*$tag), "\n";
print "Aktuell : ", scalar localtime($heute + $korrektur*$tag), "\n";
print "nächste Woche : ", scalar localtime($heute + $korrektur*$tag + 7*$tag), "\n";
print "übernächste Woche : ", scalar localtime($heute + $korrektur*$tag + 14*$tag), "\n";


Das Problem ist die Sommer/Winterzeit, deshalb ging es ab 23:00 schief.


als Antwort auf: [#194551]
(Dieser Beitrag wurde von oesi50 am 7. Nov 2005, 09:57 geändert)

Re: Zeitabhänige Anzeige

SabineP
Beiträge gesamt: 7586

7. Nov 2005, 09:23
Beitrag # 13 von 29
Beitrag ID: #194576
Bewertung:
(9484 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hanü,

>> Der Wert [6], also die 6. Stelle, ist doch aber das Jahr, und nicht der Wochentag!?

Die Stelle 6 ist der Wochentag, da die erste Stelle die 0 hat:
http://perldoc.perl.org/...tions/localtime.html

Soviel zur Aufklärung.

Gruß Sabine


als Antwort auf: [#194551]

Re: Zeitabhänige Anzeige

trueprojects
Beiträge gesamt:

7. Nov 2005, 20:13
Beitrag # 14 von 29
Beitrag ID: #194777
Bewertung:
(9472 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi Oesi,

wenn ich dein Script so wie es ist ausführe, erhalte ich folgende Daten (gekürzt) als Ergebnis:

Thu Dec 23 20:02:44 2004
Thu Dec 30 20:02:44 2004
Aktuell : Thu Jan 6 20:02:44 2005
Thu Jan 13 20:02:44 2005
Thu Jan 20 20:02:44 2005

Das ist kein Mittwoch, was du ja eigentlich hier angegeben hast:
$wochentag = 3; # 0:So 1:Mo 2:Di 3:Mi 4:Do 5:Fr 6:Sa

Und das Datum stimmt überhaupt nicht, es ist das falsche Jahr, der falsche Monat und der falsche Tag...

da stimmt doch irgendwas anderes nicht, oder stell ich mich zu doof an?! Ich geh die Sache gleich mal ganz anders an, mir kommt da gerade eine Idee... moment...


als Antwort auf: [#194572]

Re: Zeitabhänige Anzeige

SabineP
Beiträge gesamt: 7586

7. Nov 2005, 20:33
Beitrag # 15 von 29
Beitrag ID: #194780
Bewertung:
(9470 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hanü,

was hat denn Dein Server für eine Uhrzeit?

Hier ein kleines Prüfscript:

#!/usr/bin/perl
print scalar localtime(time);


Gruß Sabine


als Antwort auf: [#194777]
X