MSSQL Abfrage

Webi

Angesehenes Mitglied
Hallo

Brauche mal wieder Hilfe für eine MSSQL-Abfrage. Ich möchte mit der untenstehenden Abfrage als Ergebnis alle Datensätze bekommen, die zwischen "Jetzt" und "Jetzt minus einem Tag" sind. Das Feld enddate ist das Datumsfeld im Format "2008-01-02 11:18:00.000".

CODE SELECT idl, enddate FROM ac_auctions WHERE enddate < DATEADD(dd, -1, GETDATE())


Bisher habe ich bei meinem Versuchen entweder keine Datensätze bekommen oder alle möglichen. Jemand eine Idee, wie ich die entsprechenden Ergebnisse erhalte?

Danke und Gruss
Roland
 
Entweder so:
CODE SELECT idl, enddate FROM ac_auctions WHERE enddate > DATEADD(dd, -1, GETDATE())

oder sauberer:

CODE SELECT idl, enddate FROM ac_auctions WHERE enddate BETWEEN DATEADD(dd, -1, GETDATE()) AND GETDATE()


Testen kann ich MSSQL erst auf der Arbeit, daher keine 100% Gewähr...

Gruß,
Tom
 
QUOTE (Webi @ Di 6.05.2008, 23:01)Das Feld enddate ist das Datumsfeld im Format "2008-01-02 11:18:00.000".
...

CODE SELECT idl, enddate FROM ac_auctions WHERE enddate < DATEADD(dd, -1, GETDATE())

...
Bisher habe ich bei meinem Versuchen entweder keine Datensätze bekommen oder alle möglichen.

Im Prinzip ist der Code richtig, abgesehen von der falschen Richtung '<'.

Allerdings kennt MSSql kein Format für Datumsfelder. Das Format wird erst bei der Ausgabe festgelegt.

Deshalb: Ist das aus Versehen ein nvarchar(20) o.ä.? Das würde nämlich das etwas merkwürdige Resultat erklären, da dann effektiv ein Stringvergleich gemacht worden wäre - mit nicht so sinnvollen Ergebnissen.
 
@jauer

Heisst dies, dass das Datum vor dem Vergleich in einen String umgewandelt wird und dadurch beim Resultat dann entweder kein Datensatz rauskommt oder alle möglichen? Verstehe ich dies richtig? Und falls ja, wie kann ich dies umgehen?
 
QUOTE (Webi @ Mi 7.05.2008, 11:22)Heisst dies, dass das Datum vor dem Vergleich in einen String umgewandelt wird und dadurch beim Resultat dann entweder kein Datensatz rauskommt oder alle möglichen? Verstehe ich dies richtig? Und falls ja, wie kann ich dies umgehen?


Wenn das Feld 'enddate' vom Datentyp nvarchar / varchar / char ist, dann wird das Ergebnis von DateAdd implizit in einen String umgewandelt und es werden die Strings miteinander verglichen. U.a. mit dem Problem, daß das Ergebnis von DateAdd womöglich als 'May 7 2008 4:34PM' ausgegeben wird. Daß nun Textvergleiche etwas schräg werden, dürfte klar sein.

Wenn das Feld 'enddate' vom korrekten Datentyp DateTime (oder smalldatetime) ist, dann werden Datumsangaben miteinander verglichen (intern faktisch Dezimalzahlen: Der Ganzzahlanteil bestimmt das Datum, der Dezimalteil die Uhrzeit).

Deshalb: Innerhalb vom MS-SqlServer ist diese Aussage


QUOTE Das Feld enddate ist das Datumsfeld im Format "2008-01-02 11:18:00.000".


unsinnig, falls das Feld 'enddate' ein Datetime-Format hat. Ich meine aber, das schon bei PHP-Code gesehen zu haben, daß Datumsangaben als Stringfelder abgespeichert und dann per Textvergleich ausgewertet werden.

Da Du oben das Format angegeben hast, hört sich das für mich nach so einer Tradition an. Damit ist mir nicht klar: Welches Format hat 'enddate'?
 
Das Feld enddate ist vom Datentyp DateTime.
Die Abfrage von Tom hat mein Problem gelöst. Es werden nun die richtigen Ergebnisse angezeigt. Danke!

Gruss
Roland
 
Zurück
Oben