Compare DATETIME y DATE ignorando la parte del tiempo

Tengo dos tablas donde column [date] es tipo de DATETIME2(0) .

Tengo que comparar dos registros solo por sus partes de fecha (día + mes + año), descartando partes de tiempo (horas + minutos + segundos).

¿Cómo puedo hacer eso?

Utilice CAST para el nuevo tipo de datos DATE en SQL Server 2008 para comparar solo la parte de la fecha:

 IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE) 

Un pequeño inconveniente en la respuesta de Marc es que ambos campos de fecha han sido encasillados, lo que significa que no podrá aprovechar ningún índice.

Entonces, si hay una necesidad de escribir una consulta que pueda beneficiarse de un índice en un campo de fecha, entonces es necesario el siguiente enfoque (bastante intrincado).

  • El campo de fecha indexado (llámalo DF1) no debe ser tocado por ningún tipo de función.
  • Por lo tanto, debe comparar DF1 con el rango completo de valores de fecha y hora para el día de DF2.
  • Eso es desde la fecha-parte de DF2, a la fecha-parte del día después de DF2.
  • Es decir (DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
  • NOTA : Es muy importante que la comparación sea > = (igualdad permitida) a la fecha de DF2, y (estrictamente) < el día después de DF2. Además, el operador BETWEEN no funciona porque permite la igualdad en ambos lados.

PD: Otro medio de extraer la fecha solamente (en versiones anteriores de SQL Server) es utilizar un truco de cómo se representa internamente la fecha.

  • Echa la fecha como un flotador.
  • Truncar la parte fraccionaria
  • Emitir el valor a una fecha y hora
  • Ejemplo: CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)

Aunque cambié la respuesta marcada como correcta. Quería tocar algunas cosas para cualquiera que tropezara con esto.

En general, si está filtrando específicamente en valores de fecha solo. Microsoft recomienda utilizar el formato de idioma neutral de ymd o ymd .

Tenga en cuenta que el formulario ‘2007-02-12’ se considera de idioma neutral solo para los tipos de datos DATE, DATETIME2 y DATETIMEOFFSET.

Hacer una comparación de fechas usando el enfoque mencionado es simple. Considere el siguiente ejemplo ingenioso.

 --112 is ISO format 'YYYYMMDD' declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112) select * from Sales.Orders where CONVERT(char(8), OrderDate, 112) = @filterDate 

En un mundo perfecto, se debe evitar realizar cualquier manipulación en la columna filtrada, ya que esto puede impedir que SQL Server use los índices de manera eficiente. Dicho eso, si los datos que está almacenando solo se refieren a la fecha y no al tiempo, considere almacenar como DATETIME con la medianoche como hora. Porque:

Cuando SQL Server convierte el literal al tipo de columna filtrada, asume la medianoche cuando no se indica una parte de tiempo. Si desea que dicho filtro devuelva todas las filas a partir de la fecha especificada, debe asegurarse de almacenar todos los valores a medianoche como la hora.

Por lo tanto, suponiendo que solo le preocupe la fecha, y almacene sus datos como tales. La consulta anterior se puede simplificar a:

 --112 is ISO format 'YYYYMMDD' declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112) select * from Sales.Orders where OrderDate = @filterDate 

Puedes probar este

 CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') 

Lo pruebo para MS SQL 2014 con el siguiente código

 select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok' else '' end 

Para Comparar dos fechas como MM / DD / AAAA a MM / DD / AAAA . Recuerde El tipo de columna First of field debe ser dateTime. Ejemplo: columnName: payment_date dataType: DateTime .

después de eso, puedes compararlo fácilmente. Query es:

 select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'. 

Es muy simple ... Lo probó .....

    Intereting Posts