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.