Ich habe eine Spalte, die Daten im Datetime-Format speichert. Ich möchte nach allen Instanzen suchen, in denen der Zeitteil dieser Spalte nicht gleich 00: 00: 00: 000 ist - das Datum spielt keine Rolle.
Grundsätzlich, wenn time () eine Funktion ist, etwa so:
%Vor%Wie gehe ich dabei vor?
Sie brauchen nur eine kleine Änderung an dem, was Sie bereits haben.
%Vor% Verwenden Sie CONVERT , um DATETIME
in TIME
zu ändern.
Verwenden Sie DATEDIFF
und DATEADD
, um stattdessen den Datumsteil der Datetime zu erhalten. Vergleichen Sie die Spalte nur mit dem Datum und es werden diejenigen Zeilen zurückgegeben, die eine Zeit ungleich Null haben.
Das funktioniert so, dass wir zunächst die Differenz (in Tagen) zwischen der Epoche und dem Wert berechnen. Wir fügen diese Nummer der Epoche hinzu, um eine neue Datetime zu erstellen. Da das Ergebnis von DATEDIFF
eine ganze Zahl ist, wird jede Zeitkomponente abgerundet.
Die Zeitfunktion könnte dann folgendermaßen implementiert werden, nicht dass ich sie für dieses spezielle Szenario empfehle:
%Vor% Bearbeiten: Wie in anderen Antworten erwähnt, können Sie in DATE
umwandeln, um den gleichen Effekt wie in DATEADD(d, DATEDIFF(d, 0, DateColumn), 0)
zu erzielen. DATE wurde jedoch nur in SQL Server 2008 hinzugefügt, während die Formel mindestens auf SQL 2000 zurückkompatibel ist. Wenn Sie also Abwärtskompatibilität benötigen oder mit SQL CE arbeiten, ist das Umwandeln in DATE nicht möglich.
Ich mache das die ganze Zeit, wenn ich versuche zu sehen, ob die Spalte einer Tabelle in ein Datum anstatt in eine Datetime umgewandelt werden soll, was wirklich die Antwort ist.
%Vor%Die Besetzung entfernt die Zeit, und datetime hat eine höhere Priorität. Wenn sie also ungleich ist, hat sie einen Zeitwert. Das Gleiche könnte mit einer Besetzung zu Zeit, mit ein bisschen anderer Syntax getan werden.
Tags und Links sql sql-server-2008 tsql