MS SQL confronta le date?


88

Ho 2 date (datetimes):

data1 = 2010-12-31 15: 13: 48.593
data2 = 2010-12-31 00: 00: 00.000

È lo stesso giorno, solo tempi diversi. Il confronto tra data1 e data2 utilizzando <= non funziona a causa dell'ora di data1. Quindi date1 <= date2 è sbagliato, ma dovrebbe essere vero. Posso confrontarli semplicemente guardando anno, mese e giorno in modo che siano uguali? È SQL Server 2008.

Grazie :)


Quale versione di SQL Server? In quale contesto stai facendo questo confronto (se stai confrontando con le colonne devi fare attenzione a mantenere le cose sargable)?
Martin Smith

Lo sto facendo in un "caso selezionato". Se le date sono <= fai questo, altrimenti fallo. È SQL Server 2008
grady

Affinché il confronto non riesca, sembra che la data sia memorizzata come stringhe. Se sono stati memorizzati come datetime, immagino che il confronto
pascal

date1 <= date2 = true? com'è che le 15:00 sono meno di 12:00?
4 Lascia la copertina

Risposte:


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

Dovresti fare quello che ti serve.

Caso di prova

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 

ritorna

COMPARISON_WITH_CAST   |  COMPARISON_WITHOUT_CAST
Y                         N

1
Si noti che il DATEtipo non era disponibile prima di SQL Server 2008.
LukeH

@Luke - Già. Da qui la mia domanda su quale versione sia l'OP.
Martin Smith

@grady - Sì lo fa! Guarda il test case questo fa esattamente quello che dici di volere!
Martin Smith

68

Usa la DATEDIFFfunzione con una parte data di day.

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

Nota che se vuoi testarlo date1<= date2allora devi testarlo DATEDIFF(day, date1, date2) >= 0, o in alternativa potresti testarlo DATEDIFF(day, date2, date1) <= 0.


Funziona, ma puoi spiegare perché? Non è solo un confronto dei giorni?
grady

1
@grady: No, conta il numero di limiti del giorno tra date1e date2; ovvero, il numero di mezzanotte che date1date2
passeresti

5
+1 La soluzione più elegante qui. Considererei ABS o <> 0 anche se se necessario per consentire la data2 prima della data1
gbn

3

La semplice soluzione di una riga è

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

Puoi provare varie opzioni con questa diversa da "dd"


0

Prova questo:

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

0

Ho sempre usato DateDiff (day, date1, date2) per confrontare due date.

Checkout seguente esempio. Basta copiarlo ed eseguire in Ms sql server. Inoltre, prova con la modifica della data dal 31 dicembre al 30 dicembre e controlla il risultato

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.