SQL Datum Vergleichen, nur mit Datum-nicht die Zeit
Ursprünglich wurde Sie gehen, um eine Frage zu, wie diese umzusetzen ist, denn ich steckte in einem bestimmten Teil, aber ich bin jetzt neugierig, warum dies geschah in den ersten Platz. Ich brauchte, um zu vergleichen, nur die Daten nicht die Zeit, das wäre kein problem gewesen, wenn die Zeiten nicht unterscheiden. Der code unten zeigt die Abfrage, die ich ursprünglich versucht
SELECT *
FROM Employee e
inner join OT_Hours o on o.Emp_ID=e.Emp_ID
inner join Position p on p.Position_ID=e.Position_ID
inner join Signup_Sheet s on s.Employee_ID=e.Emp_ID
WHERE e.Eligible_OT=1 and s.Day_Shift = 1
and p.Position_Name = 'Controller'
and Convert(Varchar(20),s.Date,101) = '07/26/2010'
and Convert(Varchar(20),o.Date,101) <='07/26/2010'
and Convert(Varchar(20),o.Date,101) > '07/26/2009'
and o.Quantity NOT IN(0.3) order by o.Date DESC
Ich würde kein Ergebnis, wenn ich lief, dass die Abfrage entfernt, aber wenn ich die vorletzte Zeile würde es wieder 12 Ergebnisse (<=) und wenn ich entfernt die 3. Letzte Zeile behielt aber den vorletzten würde es wieder 6 Ergebnisse (>). Nach der Durchsicht der Daten konnte ich sehen, dass 4 von diesen Ergebnissen sollten die zurückgegeben worden sind. Nun der seltsame Teil. Unten ist der code, den ich momentan verwende.
SELECT DISTINCT o.Date, e.Emp_ID as Emp_ID, e.First_Name+ ' ' +e.Last_Name as Name, o.Quantity as Sum
FROM Employee e
left join OT_Hours o on o.Emp_ID=e.Emp_ID
left join Position p on p.Position_ID=e.Position_ID
left join Signup_Sheet s on s.Employee_ID=e.Emp_ID
WHERE e.Eligible_OT=1 and s.Day_Shift = 1
and p.Position_Name = 'Controller'
and Convert(Varchar(20),s.Date,101) = '07/26/2010'
and o.Date between '07/26/2009' and '07/26/2010'
and o.Quantity NOT IN(0.3) order by o.Date DESC
Diese Abfrage gibt Ergebnisse zurück, aber ich habe auch getestet, wie ich, der andere, wenn die o.Bisher war über und unter dem Datum angegeben. Wenn das Datum <= 16 Ergebnisse zurückgegeben wurden, wenn > 8 Ergebnisse zurückgegeben wurden. Die Letzte Abfrage ergab 6 Ergebnisse. Nun ist dies nicht eine Produktionsdatenbank ich bin gegen Abfragen und ich bin die einzige Hilfe, damit die Daten nicht ändern. Eine Erklärung, warum dies geschehen war? Ich nehme an, es hatte etwas zu tun mit dem umwandeln in varchar und es konnte nicht vergleichen, richtig, aber das erklärt nicht, warum ich 12 <=, 6 > und dann keine Ergebnisse in der Ende. Auch wenn jemand weiß, einen besseren Weg, um dies zu implementieren, lassen Sie es mich bitte wissen.
InformationsquelleAutor Gage | 2010-07-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
In die drittletzte Zeile in der ersten Abfrage, die Sie vergleichen zwei strings.
Als solche
01/02/2009
größer ist als01/01/2010
Normalerweise mache ich Datum
BETWEEN '01/02/2009 00:00:00.000' AND '01/01/2010 23:59:59.997'
aber es wird interessant sein zu sehen, eine bessere Lösung.SELECT CASE WHEN '01/02/2009' > '01/01/2010' THEN 1 ELSE 0 END
1 zurück auf meine SQL-box.o.Date > '07/26/2009'
würde implizit konvertiert werden, aber nicht zwei varchars als pro der ersten Abfrage.Keine alternative, aber Sie beantwortet meine Frage, warum er nicht den Vergleich der Daten ordnungsgemäß. Wusste nicht, 1/02/2009 größer ist als am 01.01.2010 lol
verwenden datediff vergleichen, um den Tag Teil nur: DATEDIFF(day, FieldDate, GETDATE()) = 0 src: link
InformationsquelleAutor Chris Diver
Die beiden Abfragen nicht das gleiche - dieser:
...ist gleichbedeutend mit:
ZWISCHEN ANSI-standard und inclusive auf jeder Datenbank die ich je erlebt habe.
Daran, dass, wenn Sie nicht angeben, ein Teil für DATETIMEs, der Wert ist standardmäßig ab Mitternacht des Tages - 00:00:00.
InformationsquelleAutor OMG Ponies
Ich gelernt, diese Technik, die von SQL Server Magazin-Februar 2007 (Datum und Uhrzeit Berechnungen von Itzik Ben-Gan). Auf diese Weise werden Ihre 'zwischen' funktionieren wird, unabhängig davon, ob die Zeile das Datum ist nach Mitternacht, als alles normalisiert zu sein, um Mitternacht mit diesem Vergleich:
Datediff und dateadd arbeiten zusammen, um abzustreifen die Zeit und das Datum. Sie können dann vergleichen Sie es mit string-Literale, oder andere Termine, die hatten die gleiche änderung gemacht. Ich würde empfehlen, dies in einer Funktion.
BEARBEITEN:
Basierend auf OMG-Ponys' Kommentare. Diese profitieren nicht von einem index auf der Spalte Datum. Eine alternative könnte die Verwendung der Zeit-stripping-Technik neben der Technik, die andere erwähnt haben. So zu tun, anstatt es auf dem Tisch-Spalte, tun Sie es auf das Letzte argument für 'zwischen'. Sie könnten die Funktion etwa so:
Dieser nimmt das argument Datum, legt es auf Mitternacht des nächsten Tages, dann subtrahiert zwei Millisekunden, was am Ende des Tages für die angegebene datetime an. Also dann könnten Sie tun:
'CAST(FLOOR(CAST('
Methode?Ich kann mich nicht erinnern. Er verglich ein paar, und dies schien der beste zu sein.
Ich empfehle nicht diese - mit Hilfe einer Funktion auf eine Spalte macht ein index, falls vorhanden, nutzlos.
Ponys - Interessant - auf jeden Fall eine überlegung Wert. Also, wenn Sie Links "inline", wird der index verwendet werden würde?
Sorry, ich verstehe nicht "Links inline"?
InformationsquelleAutor Ryan Ische
InformationsquelleAutor LukeH
Mein Vorschlag wäre, passen Sie Ihre Kriterien abdecken Zeiten, nicht die Daten selbst. Wenn Sie zu konvertieren oder anderweitig zu manipulieren, das die Spalte(N) für das vergleichen können Sie zerstören die Verwendung von Indizes in der Abfrage.
Vergleichen Sie auch die Termine auf Termine. Wenn Sie konvertieren Sie Sie in strings und versuchen, Sie zu vergleichen, Sie laufen in Probleme, als Chris Diver Punkte aus.
In deinem Fall würde ich versuchen:
Müssen Sie sicherstellen, dass die Parameter oder Variablen sind immer ohne Zeit Teil.
InformationsquelleAutor Tom H
Wenn sich Ihre Datenbank von SQL Server, was ich getan habe, die ziemlich gut funktioniert zu strip vor der Zeit, ist so etwas wie das folgende....
Je nachdem, wie deine Parameter eingestellt sind '07/26/2010', '07/26/2009" man kann speichern Sie in datetime-Variablen, und führen Sie die gleichen
cast(floor(cast(@datevar as float)) as datetime)
Betrieb.Scheint dies ein repost. Überprüfen Sie die akzeptierte Antwort hier... Wie Sie die Zeit Teil eines datetime-Werts (SQL-Server)?
InformationsquelleAutor Wil P