MS SQL порівнює дати?


86

У мене є 2 дати (дати):

date1 = 2010-12-31 15: 13: 48.593 date2
= 2010-12-31 00: 00: 00.000

Це того самого дня, просто різного часу. Порівняння date1 та date2 за допомогою <= не працює через час date1. Отже, date1 <= date2 є неправильним, але має бути правдою. Чи можу я порівняти їх, просто подивившись рік, місяць і день, щоб вони однакові? Його SQL Server 2008.

Дякую :)


Яка версія SQL Server? У якому контексті ви робите це порівняння (якщо ви порівнюєте зі стовпцями, вам слід подбати про те, щоб речей було зручним)
Martin Smith

Я роблю це у "обраному випадку". Якщо дати <= зробити це, якщо ні, то те. Його SQL Server 2008
градація,

Щоб порівняння не вдалося, здається, що ваша дата зберігається як рядки. Якщо вони зберігались як дата і час, я думаю, порівняння
pascal

date1 <= date2 = true? як 15:00 менше 12:00?
4 Залиште обкладинку

Відповіді:


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

Повинен робити те, що тобі потрібно.

Тестовий кейс

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 

Повернення

COMPARISON_WITH_CAST   |  COMPARISON_WITHOUT_CAST
Y                         N

1
Зверніть увагу, що DATEтип був недоступний до SQL Server 2008.
LukeH

@Luke - Так. Звідси мій запит щодо версії OP.
Martin Smith

@grady - Так, це так! Дивіться тестовий випадок, це робить саме те, що ви кажете, що хочете!
Martin Smith

68

Використовуйте DATEDIFFфункцію з датою day.

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

Зверніть увагу, що якщо ви хочете перевірити, що date1<=, date2тоді вам потрібно перевірити це DATEDIFF(day, date1, date2) >= 0, або ж ви можете протестувати DATEDIFF(day, date2, date1) <= 0.


Це працює, але ви можете пояснити, чому? Хіба це не просто порівняння днів?
Грейді

1
@grady: Ні, він підраховує кількість денних меж між date1та date2; тобто кількість date1date2
півноч,

5
+1 Найелегантніше рішення тут. Я б розглянув АБС або <> 0, хоча, якщо потрібно дозволити date2 до date1
gbn

3

Просте однолінійне рішення -

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

Ви можете спробувати різні варіанти, окрім "dd"


0

Спробуйте це:

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

Я завжди використовую DateDiff (день, дата1, дата2) для порівняння двох дат.

Оформити замовлення за наступним прикладом. Просто скопіюйте це та запустіть на сервері Ms sql. Також спробуйте змінити дату з 31 грудня на 30 грудня і перевірте результат

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.