php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 21-02-2009, 17:46
DerUnsympath
 Registrierter Benutzer
Links : Onlinestatus : DerUnsympath ist offline
Registriert seit: Jul 2005
Beiträge: 50
DerUnsympath ist zur Zeit noch ein unbeschriebenes Blatt
Standard Nur Datensätze anzeigen, wenn heute zwischen zwei angegebenen Daten liegt

Hallo,

ich habe eine MySQL-Tabelle, mit u.a. zwei Feldern 'date_start' und 'date_end' des Typs INT, darin steht der Timestamp. Beide Felder stellen einen Datumsbereich dar, also z.B. 15.02.-05.03.

Nun möchte ich alle Datensätze auslesen, bei denen heute (also 21.02.) in diesem Datumsbereich liegt. Das Jahr spielt darin keine Rolle, da es sich um wiederkehrende Ereignisse handeln soll.

Ich habe schon vieles probiert, aber irgendwie klappt es nicht.
PHP-Code:
$sql "SELECT * FROM daten WHERE (DAY(FROM_UNIXTIME(date_start)) BETWEEN " date('d') . 
AND DAY(FROM_UNIXTIME(date_start)) AND MONTH(FROM_UNIXTIME(date_start)) BETWEEN " 
date('m') . 
AND MONTH(FROM_UNIXTIME(date_start))) AND (DAY(FROM_UNIXTIME(date_end)) BETWEEN " 
date('d') . " AND DAY(FROM_UNIXTIME(date_end)) 
AND MONTH(FROM_UNIXTIME(date_end)) BETWEEN " 
date('m') . " AND MONTH(FROM_UNIXTIME(date_end)))" 
Würde mich daher über Hilfe freuen, oder zumindest eine Anregung.

Viele Grüße
__________________
Mit Zitat antworten
  #2 (permalink)  
Alt 21-02-2009, 19:02
Wurzel
 Master
Links : Onlinestatus : Wurzel ist offline
Registriert seit: Jul 2002
Ort: double-u-upper-valley
Beiträge: 7.477
Wurzel ist zur Zeit noch ein unbeschriebenes Blatt
Standard

du denkst zu kompliziert :-)

Code:
SELECT 
    bla 
FROM 
    blubb 
WHERE 
    start < aktueller-timestamp 
AND 
    end > aktueller-timestamp
den "aktueller-timestamp" ermittelst du zb. mit mktime().
__________________
Kissolino.com
Mit Zitat antworten
  #3 (permalink)  
Alt 21-02-2009, 20:31
DerUnsympath
 Registrierter Benutzer
Links : Onlinestatus : DerUnsympath ist offline
Registriert seit: Jul 2005
Beiträge: 50
DerUnsympath ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo Wurzel,

leider ist es ganz so einfach nicht. Denn das Jahr spielt im Timetamp keine Rolle, daher muss ich mit DAY und MONTH arbeiten. Es handelt sich um wiederkehrende Ereignisse.

Zum zweiten stellt mich die DAY()-Abfrage vor ein Problem. Denn angenommen, das Startdatum sei "31.12.", das Enddatum der "27.02.". Heute ist der "21.02". Der "21." liegt nicht zwischen dem "31." und "27.", wohl aber zwischen den beiden Daten (den Monat berücksichtigend). Daher kann ich BETWEEN nicht verwenden, oder?
__________________
Mit Zitat antworten
  #4 (permalink)  
Alt 21-02-2009, 21:16
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Wenn du das Jahr nicht berücksichtigst liegt ein Datum immer zwischen zwei anderen:

01.03 - 01.05
oder
01.05 - 01.03

Du solltest erstmal genau spezifizieren was du suchst, und dann deinen Query entsprechend bauen.
Mit Zitat antworten
  #5 (permalink)  
Alt 22-02-2009, 00:12
Wurzel
 Master
Links : Onlinestatus : Wurzel ist offline
Registriert seit: Jul 2002
Ort: double-u-upper-valley
Beiträge: 7.477
Wurzel ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von DerUnsympath
Denn das Jahr spielt im Timetamp keine Rolle, daher muss ich mit DAY und MONTH arbeiten.
nein, musst du nicht, denn der timestamp für den 27.2. ist 2006 derselbe
wie 2009 oder 1998.

die frage ist ja, wie weit die start-/end-daten auseinander liegen. du
musst dir halt überlegen, wann das ganze vom jeweiligen zeitpunkt
aus kippt und das in der zusammenstellung der query berücksichtigen.

schau dir mal den timestamp für den 01.01. und den 31.12. an. wo
verläuft die grenze, wenn dein bereich den 15.12. bis zum 15.01.
umfasst? und wie kannst du die ermitteln?

wenn ich jetzt nicht völlig verplant bin, gibt es nur die wahl zwischen
dem pseudo-code oben und einer alternativen abfrage mit einem OR
sobald ein bestimmtes ereignis eintritt.

PS: der haken der ganzen geschichte mit der timestamp-rechnerei
könnte der 29.02. sein.
__________________
Kissolino.com
Mit Zitat antworten
  #6 (permalink)  
Alt 22-02-2009, 17:24
DerUnsympath
 Registrierter Benutzer
Links : Onlinestatus : DerUnsympath ist offline
Registriert seit: Jul 2005
Beiträge: 50
DerUnsympath ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Für alle, die es interessiert, hier die Lösung:
PHP-Code:
SELECT FROM daten
WHERE
   
(DATE_FORMAT(NOW(), "%m%d"BETWEEN
      DATE_FORMAT
(FROM_UNIXTIME(date_start), "%m%d") AND
      
DATE_FORMAT(FROM_UNIXTIME(date_end), "%m%d"))
OR (
DATE_FORMAT(FROM_UNIXTIME(date_end), "%m%d"BETWEEN
      DATE_FORMAT
(NOW(), "%m%d") AND
      
DATE_FORMAT(FROM_UNIXTIME(date_start) - INTERVAL 1 DAY"%m%d"))
OR (
DATE_FORMAT(FROM_UNIXTIME(date_start), "%m%d"BETWEEN
      DATE_FORMAT
(FROM_UNIXTIME(date_end) + INTERVAL 1 DAY"%m%d") AND
      
DATE_FORMAT(NOW(), "%m%d")) 
Weiß nicht, ob's da Optimierungsmöglichkeiten gibt, aber es läuft.
__________________
Mit Zitat antworten
  #7 (permalink)  
Alt 22-02-2009, 19:40
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

... WHERE ((heute BETWEEN start AND end) AND start <= end) OR (end < heute AND heute < start)
Mit Zitat antworten
  #8 (permalink)  
Alt 22-02-2009, 20:14
DerUnsympath
 Registrierter Benutzer
Links : Onlinestatus : DerUnsympath ist offline
Registriert seit: Jul 2005
Beiträge: 50
DerUnsympath ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von onemorenerd
... WHERE ((heute BETWEEN start AND end) AND start <= end) OR (end < heute AND heute < start)
Das berücksichtigt aber das Jahr. Das möchte ich ja nicht, da es sich um wiederkehrende Ereignisse handelt.
__________________
Mit Zitat antworten
  #9 (permalink)  
Alt 22-02-2009, 20:40
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Das ist Pseudo-SQL. Ich wollte nicht diese langen DATE_FORMATs schreiben. Es funktioniert ohne Jahr.
Bei deiner Query bin ich mir nicht sicher, ob sie korrekt ist. Vermutlich nicht. Davon abgesehen ist sie komplizierter, daher sicher auch langsamer.
Mit Zitat antworten
  #10 (permalink)  
Alt 22-02-2009, 23:19
kuddeldaddeldu
 Registrierter Benutzer
Links : Onlinestatus : kuddeldaddeldu ist offline
Registriert seit: Sep 2006
Beiträge: 437
kuddeldaddeldu ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,

Zitat:
Original geschrieben von ghostgambler
Wenn du das Jahr nicht berücksichtigst liegt ein Datum immer zwischen zwei anderen:

01.03 - 01.05
oder
01.05 - 01.03
ich denke, dadurch, dass festegelgt ist, welches das Start- und welches das Enddatum sein soll, ist die Eindeutigkeit schon gegeben.


Zitat:
Original geschrieben von ghostgambler
... WHERE ((heute BETWEEN start AND end) AND start <= end) OR (end < heute AND heute < start)
Hmm, beim ersten Teil ist "AND start <= end" eigentlich überflüssig, oder nicht?
Der zweite Teil matcht eher auf Termine, die nicht im Zeitraum liegen:

start = 1.12, end = 10.2., heute = 22.02:

0210 < 0222 < 1201

Zitat:
Original geschrieben von ghostgambler
Bei deiner Query bin ich mir nicht sicher, ob sie korrekt ist. Vermutlich nicht.
Müsste eigentlich korrekt sein. Die Logik sieht so aus:
Für ein Datum, dass innerhalb eines Zeitraumes liegt, gibt's 3 Fälle:

1. Start, heute und Ende liegen im selben Jahr (der einfachste Fall): => start <= heute <= end
2. Zwischen heute und Ende liegt ein Jahreswechsel: => end < start <= heute
3. Zwischen Start und heute liegt ein Jahreswechsel: => heute <= end < start

Genau das bildet die Abfrage ab.

LG
Mit Zitat antworten
  #11 (permalink)  
Alt 24-02-2009, 12:39
MelloPie
 PHP Master
Links : Onlinestatus : MelloPie ist offline
Registriert seit: Jan 2002
Ort: Hessen
Beiträge: 4.380
MelloPie ist zur Zeit noch ein unbeschriebenes Blatt
Standard

falls Du mit mysql arbeites würde ich das mit der Funktion dayofyear loesen.
also dayofyear(dat) between dayofyear(dat1) and dayofyear(dat2)
__________________
Beantworte nie Threads mit mehr als 15 followups...
Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25
Mit Zitat antworten
  #12 (permalink)  
Alt 24-02-2009, 15:41
kuddeldaddeldu
 Registrierter Benutzer
Links : Onlinestatus : kuddeldaddeldu ist offline
Registriert seit: Sep 2006
Beiträge: 437
kuddeldaddeldu ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,

das würde aber jahresübergreifend nicht funktionieren. Ich wüsste keinen Weg, wie er um die 3 Fälle herumkommen soll.

LG
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 04:26 Uhr.