69304
04.05.2009, aktualisiert um 11:55:04 Uhr
12749
12
0
MS SQL Abfrage von Datumsbereich per PHP Convert Datetime
Hallo!
Ich verzweifel bald bezüglich folgender Abfrage per PHP an unserem Microsoft SQL Server:
SELECT * FROM stat_local WHERE (Endedatum <= CONVERT(DATETIME, '2009-02-06 00:00:00.000', 104)) AND (Anfangsdatum >= CONVERT(DATETIME, '2009-02-02 00:00:00.000', 104))
Ich habs auch schon so versucht:
SELECT * FROM stat_local WHERE (Endedatum <= CONVERT(DATETIME, '20090206')) AND (Anfangsdatum >= CONVERT(DATETIME, '20090201'))
Ich komm so leider auf keinen grünen Zweig! Das Datenbankfeld "Endedatum", sowie "Anfangsdatum" hat den Typ datetime(8).
Per Ausgabe in PHP bekomme ich sehr viele Wert, beginnend von 02.02.2009 bis 28.04.2009:
[name]--[nummer]--[2009-03-03 00:00:00.000]--[09:35]--[2008-03-03 00:00:00.000]--[10:15]
[Irrelevant]--[Irrelevant]--[Anfangsdatum]--[Zeit]--[Endedatum]--[Zeit]
Ja, ich weis, dass die Zeit auch komplett als Zeit hinterlegt werden hätte können, aber die Datenbankstruktur ist leider nicht von mir.
Wie müsste die Abfrage lauten, dass ich alles was zwischen z.B. dem 01.02.2009 und dem 07.02.2009 liegt ausgegeben bekomme?
Win Serv 2003 mit Microsoft SQL Enterprise Manager v8.0
Gruß,
René.
Ich verzweifel bald bezüglich folgender Abfrage per PHP an unserem Microsoft SQL Server:
SELECT * FROM stat_local WHERE (Endedatum <= CONVERT(DATETIME, '2009-02-06 00:00:00.000', 104)) AND (Anfangsdatum >= CONVERT(DATETIME, '2009-02-02 00:00:00.000', 104))
Ich habs auch schon so versucht:
SELECT * FROM stat_local WHERE (Endedatum <= CONVERT(DATETIME, '20090206')) AND (Anfangsdatum >= CONVERT(DATETIME, '20090201'))
Ich komm so leider auf keinen grünen Zweig! Das Datenbankfeld "Endedatum", sowie "Anfangsdatum" hat den Typ datetime(8).
Per Ausgabe in PHP bekomme ich sehr viele Wert, beginnend von 02.02.2009 bis 28.04.2009:
[name]--[nummer]--[2009-03-03 00:00:00.000]--[09:35]--[2008-03-03 00:00:00.000]--[10:15]
[Irrelevant]--[Irrelevant]--[Anfangsdatum]--[Zeit]--[Endedatum]--[Zeit]
Ja, ich weis, dass die Zeit auch komplett als Zeit hinterlegt werden hätte können, aber die Datenbankstruktur ist leider nicht von mir.
Wie müsste die Abfrage lauten, dass ich alles was zwischen z.B. dem 01.02.2009 und dem 07.02.2009 liegt ausgegeben bekomme?
Win Serv 2003 mit Microsoft SQL Enterprise Manager v8.0
Gruß,
René.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 115209
Url: https://administrator.de/contentid/115209
Ausgedruckt am: 22.11.2024 um 18:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo rbrixel,
ich habe zwar noch nicht mit MySql gearbeitet, aber theoretisch müsste das auch gehen:
Gruß Dieter
ich habe zwar noch nicht mit MySql gearbeitet, aber theoretisch müsste das auch gehen:
StrComp("20090303",Left(Replace("2009-03-04 00...","-",""),8)) = < (-1), = (0), > (1)
Gruß Dieter
Hallo,
evtl hilft die php-Funktion strtotime weiter.
Die SQL-Abfrage wäre dann:
$sql="SELECT ...
WHERE UNIX_TIMESTAMP(Anfangsdatum) <=' ".strtotime($datum_von)."'
AND UNIX_TIMESTAMP(Endedatum) > ' ".strtotime($datum_bis)." ' ";
$erg=mysql_query($sql);
...
ACHTE darauf, dass die Datumsvariablen in einzelnen und doppelten Hochkomma sind.
(die einzelnen für SQL und die doppelten für PHP)
Gruß Locke
evtl hilft die php-Funktion strtotime weiter.
Die SQL-Abfrage wäre dann:
$sql="SELECT ...
WHERE UNIX_TIMESTAMP(Anfangsdatum) <=' ".strtotime($datum_von)."'
AND UNIX_TIMESTAMP(Endedatum) > ' ".strtotime($datum_bis)." ' ";
$erg=mysql_query($sql);
...
ACHTE darauf, dass die Datumsvariablen in einzelnen und doppelten Hochkomma sind.
(die einzelnen für SQL und die doppelten für PHP)
Gruß Locke
Moin rbrixel,
na, da gehen aber die Tipps auseinander.
Um Dich vollends zu verwirren, meine Varianten.
1) Hör auf maretz' Ratschlag. Sollte gehen.
2) wenn es komplizierter aussehen sollte, dann wäre meine Argumentation
--> dei DATETIME-Feld namens Anfangsdatum auf Format und Länge von '20090206' bringen wäre mit style code 112 = ISO-Format yyyymmdd.
wenn es denn unbedingt unleserlich werden soll.
Gleichbedeutend, aber für deutsche Nasen bzw. Augen besser lesbar:
Grüße
Biber
na, da gehen aber die Tipps auseinander.
Um Dich vollends zu verwirren, meine Varianten.
1) Hör auf maretz' Ratschlag. Sollte gehen.
2) wenn es komplizierter aussehen sollte, dann wäre meine Argumentation
- Endedatum und Anfangsdatum sind je datetime-Felder, die Vergleichsdaten sind Strings.
- ergo muss ich doch, wenn ich überhaupt was CONVERTe, die Datumswerte auf eine vergleichbare Stringlänge bringen.
--> dei DATETIME-Feld namens Anfangsdatum auf Format und Länge von '20090206' bringen wäre mit style code 112 = ISO-Format yyyymmdd.
....WHERE CONVERT( Char(8), Anfangsdatum, 112) <= '20090206 .....
wenn es denn unbedingt unleserlich werden soll.
Gleichbedeutend, aber für deutsche Nasen bzw. Augen besser lesbar:
....WHERE CONVERT( Char(8), Anfangsdatum, 104) <= '06.02.2009' .....
...was aber wiederum gleichwertig sein sollte.mit maretz'.WHERE Anfangsdatum <= '06.02.2009' .....
Grüße
Biber
Moin rbrixel,
jau, hast natürlich Recht....
Da ich nun alles auf STRING gepresst habe kann logischerweise ein STRING-Vergleich mit "<='07.02.2009'" nur Grütze erzeugen...
Menno.... hab ich doch im Batch-tut "Umgang mit Datumsvariablen im Batch" selbst in epischer Breite noch breiter getreten, dass sich mit DatumsSTRINGs nur sehr begrenzt rechnen lässt.
Ich hasse Montage.
Nichtsdestotrotz muss natürlich ein Stringvergleich des ANSI- oder ISO-Datums das Gewünschte liefern.
Mit einer Formatierung auf "20090207" oder "2009-02-07" müssen also nicht 85, sondern 100% der Daten zurückkommen.
Wenn nicht-> bitte mach doch mal einen
Dann sollte ja der (Denk-)Fehler sichtbar werden.
Grüße
Biber
jau, hast natürlich Recht....
Da ich nun alles auf STRING gepresst habe kann logischerweise ein STRING-Vergleich mit "<='07.02.2009'" nur Grütze erzeugen...
Menno.... hab ich doch im Batch-tut "Umgang mit Datumsvariablen im Batch" selbst in epischer Breite noch breiter getreten, dass sich mit DatumsSTRINGs nur sehr begrenzt rechnen lässt.
Ich hasse Montage.
Nichtsdestotrotz muss natürlich ein Stringvergleich des ANSI- oder ISO-Datums das Gewünschte liefern.
Mit einer Formatierung auf "20090207" oder "2009-02-07" müssen also nicht 85, sondern 100% der Daten zurückkommen.
Wenn nicht-> bitte mach doch mal einen
SELECT Anfangsdatum, (CONVERT(Char(8), Anfangsdatum, 112),
Endedatum, (CONVERT(Char(8), Endedatum, 112)
FROM DeinGeraffel
Dann sollte ja der (Denk-)Fehler sichtbar werden.
Grüße
Biber
*peinlich berührt zu Boden blick*
tut mir ganz Leid, rbrixel,
Ich hab da ja auch zwei ganz überflüssige öffnende runde Klammern zuviel reingebracht....
...jeweils vor dem Wort CONVERT.
bzw. zwei schließende runde Klammern zuwenig, aber das wäre rausgeredet..
Letzter Montags-Rettungsversuch für heute:
Sorry sorry sorry.....
Biber
tut mir ganz Leid, rbrixel,
Ich hab da ja auch zwei ganz überflüssige öffnende runde Klammern zuviel reingebracht....
...jeweils vor dem Wort CONVERT.
bzw. zwei schließende runde Klammern zuwenig, aber das wäre rausgeredet..
Letzter Montags-Rettungsversuch für heute:
SELECT Anfangsdatum,
CONVERT(Char(8), Anfangsdatum, 112),
Endedatum,
CONVERT(Char(8), Endedatum, 112)
FROM stat_local
Sorry sorry sorry.....
Biber