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 :)


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

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.


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”


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.