¿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.