2009-12-03 25 views

Respuesta

200

Uso del CAST al nuevo tipo de datos DATE en SQL Server 2008 para comparar sólo la parte de fecha:

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

Creo que quería decir = en lugar de ==. – GilM

+2

@GilM: ¡por supuesto! ;-) Demasiado C# hoy ;-) –

53

Un pequeño inconveniente en la respuesta de Marc es que ambos datefields han sido encasillado, lo que significa que será incapaz de aprovechar cualquier índice.

Por lo tanto, si hay una necesidad de escribir una consulta que se pueda beneficiar de un índice en un campo de fecha, entonces es necesario el siguiente enfoque (algo intrincado).

  • El campo de fecha indexado (llámalo DF1) no debe ser tocado por ningún tipo de función.
  • Así que tiene que comparar DF1 con el rango completo de valores de fecha y hora para el día de DF2.
  • Eso es de la fecha-parte de DF2, a la fecha-parte del día después de DF2.
  • I.e. (DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
  • NOTA: Es muy importante que la comparación es > = (igualdad permitido) a la fecha de DF2, y (en sentido estricto) < 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
  • convertir el valor de nuevo a una fecha y hora
  • es decir, CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
-3

Para comparar dos fechas como MM/DD/AAAA a MM/DD/AAAA. Recuerde El tipo de columna de Field en primer lugar debe ser dateTime. Ejemplo: columnName: payment_date dataType: DateTime.

después de eso, puede compararlo fácilmente. consulta es:

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

Es muy simple ...... Se probó .....

+0

Esto no responde del todo la pregunta. Consulta por un mes, no por un día. –

+0

Para su consulta de marzo: Si la fecha es '3/31/2015', hora 13:00, no se encontrará. Deberías usar <'4/1/2015'. –

+0

Considere también el uso del formato de fecha internacional '2015-03-01'. En Canadá (y en muchos otros lugares), el formato oficial es DD/MM/YYYY, lo que hace que ambos formatos sean ambiguos y problemáticos. –

3

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

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

Tenga en cuenta que la forma '2007-02-12' se considera independiente del idioma solamente para la fecha de los tipos de datos, DATETIME2 y DateTimeOffset.

Hacer una comparación de fechas utilizando el enfoque anterior 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, la realización de cualquier manipulación de la columna filtrada debe evitarse ya que esto puede impedir que SQL Server desde la utilización de índices de manera eficiente. Dicho esto, si los datos que está almacenando solo se refieren a la fecha y no a la hora, considere almacenar como DATETIME con la medianoche como hora. Porque:

Cuando SQL Server convierte el literal al tipo de la columna filtrada, que asume la medianoche, cuando no se indica una parte del tiempo. Si desea que dicho filtro devuelva todas las filas a partir de la fecha especificada, debe asegurarse de que almacene 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 
0

Puede probar este

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

que prueba que para MS SQL 2014 por el siguiente código

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