MS SQL compara datas?


86

Eu tenho 2 datas (datetimes):

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

É o mesmo dia, mas em horários diferentes. Comparar data1 e data2 usando <= não funciona por causa da hora data1. Portanto, data1 <= data2 está errada, mas deveria ser verdadeira. Posso compará-los apenas olhando para o ano, mês e dia para que sejam iguais? É o SQL Server 2008.

Obrigado :)


Qual versão do SQL Server? Em que contexto você está fazendo esta comparação (se você está comparando com colunas, você precisa tomar cuidado para manter as coisas sargáveis)?
— Martin Smith

Estou fazendo isso em um "caso selecionado". Se as datas forem <= faça isso, se não, faça aquilo. Seu SQL Server 2008
— gradativo

Para que a comparação falhe, parece que suas datas são armazenadas como strings. Se eles foram armazenados como data e hora, eu acho que a comparação
— pascal

data1 <= data2 = verdadeiro? como é que 3PM é menos que 12h?
— 4 Deixe a capa

Respostas:


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

Deve fazer o que você precisa.

Caso de teste

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 

Devoluções

COMPARISON_WITH_CAST   |  COMPARISON_WITHOUT_CAST
Y                         N

1
Observe que o DATEtipo não estava disponível antes do SQL Server 2008.
— LukeH

@Luke - Sim. Daí minha pergunta sobre em qual versão o OP está.
— Martin Smith

@grady - Sim, é verdade! Veja o caso de teste, isto faz exatamente o que você diz que quer!
— Martin Smith

68

Use a DATEDIFFfunção com uma parte da data de day.

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

Observe que se você quiser testar que date1<= date2, você precisa testar isso DATEDIFF(day, date1, date2) >= 0ou, alternativamente, pode testar DATEDIFF(day, date2, date1) <= 0.


Isso funciona, mas você pode explicar por quê? Isso não é apenas comparação de dias?
— grady

1
@grady: Não, ele conta o número de limites de dias entre date1e date2; isto é, o número de meia-noite que você passaria para ir date1paradate2
— LucasH

5
+1 A solução mais elegante aqui. Eu consideraria ABS ou <> 0, embora se necessário para permitir data2 antes da data1
— gbn

3

A solução simples de uma linha é

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

Você pode tentar várias opções com este diferente de "dd"


0

Experimente isto:

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

Sempre uso DateDiff (dia, data1, data2) para comparar duas datas.

Verifique o seguinte exemplo. Apenas copie e execute no servidor Ms sql. Além disso, tente alterar a data de 31 a 30 de dezembro e verifique o resultado

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.