Porównanie dat MS SQL?

86

Mam 2 daty (godziny):

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

Jest tego samego dnia, tylko o różnych porach. Porównanie daty1 i daty2 przy użyciu <= nie działa z powodu daty1 i godziny. Więc data1 <= data2 jest nieprawidłowa, ale powinna być prawdziwa. Czy mogę je porównać, patrząc po prostu na rok, miesiąc i dzień, aby były takie same? Jego SQL Server 2008.

Dzięki :)

grady
źródło
Jaka wersja programu SQL Server? W jakim kontekście robisz to porównanie (jeśli porównujesz z kolumnami, musisz uważać, aby wszystko było możliwe do zbadania)?
Martin Smith
Robię to w „wybranym przypadku”. Jeśli daty to <= zrób to, jeśli nie, zrób to. Jego SQL Server 2008
grady,
Aby porównanie się nie powiodło, wygląda na to, że Twoja data jest przechowywana jako ciągi. Gdyby były przechowywane jako data i godzina, to chyba porównanie
pascal
data1 <= data2 = prawda? dlaczego 15:00 to mniej niż 12:00?
4 Zostaw okładkę

Odpowiedzi:

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

Powinien zrobić to, czego potrzebujesz.

Przypadek testowy

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 

Zwroty

COMPARISON_WITH_CAST   |  COMPARISON_WITHOUT_CAST
Y                         N
Martin Smith
źródło
1
Zauważ, że ten DATEtyp nie był dostępny przed SQL Server 2008.
LukeH,
@Luke - Tak. Stąd moje zapytanie, w jakiej wersji jest OP.
Martin Smith,
@grady - Tak, to prawda! Zobacz przypadek testowy, robi dokładnie to, co mówisz, że chcesz!
Martin Smith,
68

Użyj DATEDIFFfunkcji z częścią daty day.

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

Zauważ, że jeśli chcesz przetestować, że date1<= date2, musisz to przetestować DATEDIFF(day, date1, date2) >= 0, lub alternatywnie możesz przetestować DATEDIFF(day, date2, date1) <= 0.

LukeH
źródło
To działa, ale czy możesz wyjaśnić dlaczego? Czy to nie tylko porównanie dni?
grady
1
@grady: Nope to zlicza liczbę dziennie granice między date1a date2; czyli liczba nocy, przez które trzeba przejść, aby przejść od date1dodate2
LukeH
5
+1 Najbardziej eleganckie rozwiązanie tutaj. Rozważałbym ABS lub <> 0, jeśli to konieczne, aby umożliwić
date2
3

Prostym rozwiązaniem jest jedna linia

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

Możesz wypróbować różne opcje z tą inną niż „dd”

Sarathi B
źródło
0

Spróbuj tego:

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
Kumar Akhil
źródło
0

Zawsze używam DateDiff (dzień, data1, data2) do porównania dwóch dat.

Do kasy następujący przykład. Po prostu skopiuj to i uruchom na serwerze Ms sql. Spróbuj też zmienić datę od 31 grudnia na 30 grudnia i sprawdź wynik

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
Jignesh Darji
źródło