¿MS SQL comparar fechas?


86

Tengo 2 fechas (fecha y hora):

fecha1 = 2010-12-31 15: 13: 48.593
fecha2 = 2010-12-31 00: 00: 00.000

Es el mismo día, solo que en diferentes momentos. La comparación de date1 y date2 usando <= no funciona debido a la hora de date1. Entonces, date1 <= date2 es incorrecto, pero debería ser cierto. ¿Puedo compararlos con solo mirar el año, mes y día para que sean iguales? Es SQL Server 2008.

Gracias :)


¿Qué versión de SQL Server? ¿En qué contexto está haciendo esta comparación (si está comparando con columnas, debe tener cuidado de mantener las cosas sargables)?
Martin Smith

Estoy haciendo esto en un "caso selecto". Si las fechas son <= haz esto, si no, haz eso. Es SQL Server 2008
grady

Para que la comparación falle, parece que su fecha se almacena como cadenas. Si se almacenaron como fecha y hora, supongo que la comparación
pascal

fecha1 <= fecha2 = verdadero? ¿Cómo son las 3 p.m. menos que las 12 a.m.?
4 Deja la portada

Respuestas:


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

Debería hacer lo que necesite.

Caso de prueba

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 

Devoluciones

COMPARISON_WITH_CAST   |  COMPARISON_WITHOUT_CAST
Y                         N

1
Tenga en cuenta que el DATEtipo no estaba disponible antes de SQL Server 2008.
LukeH

@Luke - Sí. De ahí mi consulta sobre en qué versión se encuentra el OP.
Martin Smith

@grady - ¡Sí, lo hace! Vea el caso de prueba, ¡esto hace exactamente lo que dice que quiere!
Martin Smith

68

Utilice la DATEDIFFfunción con una parte de fecha day.

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

Tenga en cuenta que si desea probar que date1<= date2, debe probarlo DATEDIFF(day, date1, date2) >= 0o, alternativamente, puede probar DATEDIFF(day, date2, date1) <= 0.


Esto funciona, pero ¿puede explicar por qué? ¿No es solo comparar días?
grady

1
@grady: No, cuenta el número de límites de días entre date1y date2; es decir, el número de medias noches que había pasar a través para llegar desde date1adate2
LukeH

5
+1 La solución más elegante aquí. Sin embargo, consideraría ABS o <> 0 si fuera necesario para permitir la fecha2 antes de la fecha1
gbn

3

La solución simple de una línea es

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

Puede probar varias opciones con esta que no sea "dd"


0

Prueba esto:

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

Siempre utilizo DateDiff (día, fecha1, fecha2) para comparar dos fechas.

Verifique el siguiente ejemplo. Simplemente copie eso y ejecútelo en Ms sql server. Además, intente cambiar la fecha antes del 31 de diciembre al 30 de diciembre y verifique el 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.