69304
Goto Top

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é.

Content-ID: 115209

Url: https://administrator.de/contentid/115209

Ausgedruckt am: 22.11.2024 um 18:11 Uhr

maretz
maretz 04.05.2009 um 12:20:43 Uhr
Goto Top
warum lässt du das convert nicht einfach von php übernehmen - so das du

where start_datum>="2009-01-01" and enddatum <="2009-12-31" bekommst?
69304
69304 04.05.2009 um 13:04:13 Uhr
Goto Top
hmm.. ok, wieso nicht

Kennst du grad den passenden Befehl? Die Datenfütterung für PHP kann ich gestalten wie ich will, das ist kein Prob.


$datum_von = "01.02.2009"; // Werden nachher per Benutzereingabe übergeben  
$datum_bis = "07.02.2009";  

list($jahr_von, $monat_von, $tag_von) = split('.', $datum_von);  
$datum_von = $jahr_von . "-" . $monat_von  . "-" . $tag_von;  
			
list($jahr_bis, $monat_bis, $tag_bis) = split('.', $datum_bis);  
$datum_bis = $jahr_bis . "-" . $monat_bis  . "-" . $tag_bis; //... usw....  

Wie müsste denn die genaue Abfrage in SQL lauten? Die Daten kann ich per PHP bereitstellen, wie sie benötigt werden.
76109
76109 04.05.2009 um 13:30:58 Uhr
Goto Top
Hallo rbrixel,

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
ITLocke
ITLocke 04.05.2009 um 13:47:51 Uhr
Goto Top
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
Biber
Biber 04.05.2009 um 14:24:57 Uhr
Goto Top
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
  • 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
69304
69304 04.05.2009 um 15:17:32 Uhr
Goto Top
Hallo!

Danke erstmal für die Tipps!

Also...

WHERE (CONVERT(Char(8), Anfangsdatum, 104) >= '01.02.2009') AND (CONVERT(Char(8), Endedatum, 104) <= '07.02.2009')

... gibt ALLES zurück. Und...

WHERE (CONVERT(Char(8), Anfangsdatum, 112) >= '20090201') AND (CONVERT(Char(8), Endedatum, 112) <= '20090207')

... gibt zu, sag mal so um die 85%, richtig zurück.

Teilweiße kommen dann aber Einträge mit (in der HTML-Ausgabe) 2009-03-27 00:00:00.000 und 2009-02-28 00:00:00.000 und 8200-11-02 00:00:00.000 (gut, dass ist eine Benutzer-Falsch-Eingabe, sollte aber trotzdem nicht angezeigt werden...

? ? ?
Biber
Biber 04.05.2009 um 15:45:35 Uhr
Goto Top
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
 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
69304
69304 04.05.2009 um 15:58:42 Uhr
Goto Top
Hey Danke erstmal Biber!!!

Ich hab...

SELECT Anfangsdatum, (CONVERT(Char(8), Anfangsdatum, 112), Endedatum, (CONVERT(Char(8), Endedatum, 112) FROM stat_local

...ausgeführt. Weisst was ich dann bekomme?

Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Zeile 1: Falsche Syntax in der Nähe von ','., SQL state 37000 in SQLExecDirect in abfrage.php on line 16


Ja, shice Montage.... ;)
Biber
Biber 04.05.2009 um 17:44:26 Uhr
Goto Top
*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:

SELECT Anfangsdatum, 
          CONVERT(Char(8), Anfangsdatum, 112), 
           Endedatum, 
           CONVERT(Char(8), Endedatum, 112) 
FROM stat_local

Sorry sorry sorry.....

Biber
69304
69304 05.05.2009 um 08:33:10 Uhr
Goto Top
k... ;)

Hätte ich eigentlich auch selber sehen sollen - aber da gestern ja Montag war und ich einfach nur Copy+Paste gemacht habe, war ja klar, dass ein Fehler auftreten musste... ;D


Jetzt sieht die Sachlage schon anders aus! Nun bekomme ich folgendes Feedback der DB:

[ 2002-10-15 00:00:00.000 ]--[ 20021015 ]--[ 2002-12-06 00:00:00.000 ]--[ 20021206 ]


Und ich habs nun wunderbar kompliziert gemacht, dass in Zukunft nur ich weiss wie´s geht... ;)

SELECT * FROM STOERUNGENHIST WHERE CONVERT(Char(8), Anfangsdatum, 112) >= CONVERT(Char(8), '20090201', 112) AND CONVERT(Char(8), Endedatum, 112) <= CONVERT(Char(8), '20090207', 112)


Danke Biber!!!
alibaba24
alibaba24 23.06.2014 um 20:50:37 Uhr
Goto Top
geht auch so: MSSQL 10.5 R2

where dtFeld >= ('08.04.2013 00:00:00.000') and dtFeld <= ('08.04.2013 23:59:59.000')

wenn dtFeld Type datetime ist
maretz
maretz 23.06.2014 um 22:47:16 Uhr
Goto Top
Nett... Aber nach über 5(!!!5) Jahren doch etwas spät, ich denke er hats zwischenzeitlich hinbekommen oder aufgegeben...