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? В каком контексте вы проводите это сравнение (если вы сравниваете со столбцами, вам нужно позаботиться о том, чтобы все было под контролем)?
Мартин Смит

Я делаю это в «избранном случае». Если даты <= сделайте это, если нет, сделайте то. Его SQL Server 2008
Грейди

Чтобы сравнение не удалось, кажется, что ваша дата хранится в виде строк. Если бы они были сохранены как datetime, я думаю, сравнение
паскаль

date1 <= date2 = true? как 15:00 меньше 12:00?
4 Leave Cover

Ответы:


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

@ Люк - Ага. Отсюда мой вопрос о том, в какой версии OP.
Мартин Смит

@grady - Да, это так! См. Тестовый пример, он делает именно то, что вы хотите!
Мартин Смит

68

Используйте DATEDIFFфункцию с датой day.

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

Обратите внимание: если вы хотите проверить это date1<=, date2вам нужно это проверить DATEDIFF(day, date1, date2) >= 0или, в качестве альтернативы, вы можете протестировать DATEDIFF(day, date2, date1) <= 0.


Это работает, но не могли бы вы объяснить, почему? Разве это не просто сравнение дней?
grady

1
@grady: Нет, он считает количество дневных границ между date1и date2; то есть количество date1date2
ночей,

5
+1 Здесь самое изящное решение. Я бы рассмотрел ABS или <> 0, хотя, если необходимо, чтобы дата2 была раньше 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 (day, date1, date2) для сравнения двух дат.

Оформить заказ в следующем примере. Просто скопируйте это и запустите на сервере 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.