MS SQL Daten vergleichen?


85

Ich habe 2 Daten (Datum):

Datum1 = 2010-12-31 15: 13: 48.593 Datum2
= 2010-12-31 00: 00: 00.000

Es ist am selben Tag, nur zu anderen Zeiten. Das Vergleichen von Datum1 und Datum2 mit <= funktioniert aufgrund der Uhrzeit von Datum1 nicht. Datum1 <= Datum2 ist also falsch, sollte aber wahr sein. Kann ich sie vergleichen, indem ich nur das Jahr, den Monat und den Tag betrachte, damit sie gleich sind? Sein SQL Server 2008.

Vielen Dank :)


Welche Version von SQL Server? In welchem ​​Kontext führen Sie diesen Vergleich durch (wenn Sie mit Spalten vergleichen, müssen Sie darauf achten, dass die Dinge sargbar bleiben)?
Martin Smith

Ich mache das in einem "ausgewählten Fall". Wenn die Daten <= sind, tun Sie dies, wenn nicht, tun Sie das. Sein SQL Server 2008
grady

Damit der Vergleich fehlschlägt, scheint Ihr Datum als Zeichenfolge gespeichert zu sein. Wenn sie als Datum / Uhrzeit gespeichert wurden, schätze ich den Vergleich
Pascal

Datum1 <= Datum2 = wahr? Wie ist 15 Uhr weniger als 12 Uhr?
4 Verlassen Sie die Deckung

Antworten:


86
SELECT CASE WHEN CAST(date1 AS DATE) <= CAST(date2 AS DATE) ...

Sollte tun, was Sie brauchen.

Testfall

WITH dates(date1, date2, date3, date4)
     AS (SELECT CAST('20101231 15:13:48.593' AS DATETIME),
                CAST('20101231 00:00:00.000' AS DATETIME),
                CAST('20101231 15:13:48.593' AS DATETIME),
                CAST('20101231 00:00:00.000' AS DATETIME))
SELECT CASE
         WHEN CAST(date1 AS DATE) <= CAST(date2 AS DATE) THEN 'Y'
         ELSE 'N'
       END AS COMPARISON_WITH_CAST,
       CASE
         WHEN date3 <= date4 THEN 'Y'
         ELSE 'N'
       END AS COMPARISON_WITHOUT_CAST
FROM   dates 

Kehrt zurück

COMPARISON_WITH_CAST   |  COMPARISON_WITHOUT_CAST
Y                         N

1
Beachten Sie, dass der DATETyp vor SQL Server 2008 nicht verfügbar war.
LukeH

@ Luke - Ja. Daher meine Frage, auf welcher Version sich das OP befindet.
Martin Smith

@grady - Ja, das tut es! Siehe Testfall, dies macht genau das, was Sie sagen, dass Sie wollen!
Martin Smith

67

Verwenden Sie die DATEDIFFFunktion mit einem Datumsteil von day.

SELECT ...
FROM ...
WHERE DATEDIFF(day, date1, date2) >= 0

Beachten Sie , wenn Sie testen möchten , dass date1<= , date2dann müssen Sie das testen DATEDIFF(day, date1, date2) >= 0, oder alternativ können Sie testen DATEDIFF(day, date2, date1) <= 0.


Das funktioniert, aber können Sie bitte erklären, warum? Ist das nicht nur ein Vergleich der Tage?
grady

1
@grady: Nein, es zählt die Anzahl der Tagesgrenzen zwischen date1und date2; die Zahl der midnights das heißt, würden Sie von bekommen passieren date1zudate2
LukeH

5
+1 Eleganteste Lösung hier. Ich würde ABS oder <> 0 in Betracht ziehen, wenn nötig, um Datum2 vor Datum1 zu berücksichtigen
gbn

3

Die einfache einzeilige Lösung ist

datediff(dd,'2010-12-31 15:13:48.593','2010-12-31 00:00:00.000')=0

datediff(dd,'2010-12-31 15:13:48.593','2010-12-31 00:00:00.000')<=1

datediff(dd,'2010-12-31 15:13:48.593','2010-12-31 00:00:00.000')>=1

Sie können verschiedene andere Optionen als "dd" ausprobieren.


0

Ich werde immer DateDiff (Tag, Datum1, Datum2) verwendet, um zwei Datumsangaben zu vergleichen.

Kasse folgendes Beispiel. Kopieren Sie das einfach und führen Sie es auf dem MS SQL Server aus. Versuchen Sie es auch mit einem Änderungsdatum von 31 bis 30 Dez. und überprüfen Sie das Ergebnis

BEGIN

declare @firstDate datetime
declare @secondDate datetime


declare @chkDay int

set @firstDate ='2010-12-31 15:13:48.593'
set @secondDate ='2010-12-31 00:00:00.000'

set @chkDay=Datediff(day,@firstDate ,@secondDate )

if @chkDay=0
    Begin
        Print 'Date is Same'
    end
else
    Begin
        Print 'Date is not Same'
    end
End

-1

Versuche dies:

BEGIN

declare @Date1 datetime
declare @Date2 datetime

declare @chkYear int
declare @chkMonth int
declare @chkDay int
declare @chkHour int
declare @chkMinute int
declare @chkSecond int
declare @chkMiliSecond int

set @Date1='2010-12-31 15:13:48.593'
set @Date2='2010-12-31 00:00:00.000'

set @chkYear=datediff(yyyy,@Date1,@Date2)
set @chkMonth=datediff(mm,@Date1,@Date2)
set @chkDay=datediff(dd,@Date1,@Date2)
set @chkHour=datediff(hh,@Date1,@Date2)
set @chkMinute=datediff(mi,@Date1,@Date2)
set @chkSecond=datediff(ss,@Date1,@Date2)
set @chkMiliSecond=datediff(ms,@Date1,@Date2)

if @chkYear=0 AND @chkMonth=0 AND @chkDay=0 AND @chkHour=0 AND @chkMinute=0 AND @chkSecond=0 AND @chkMiliSecond=0
    Begin
        Print 'Both Date is Same'
    end
else
    Begin
        Print 'Both Date is not Same'
    end
End
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.