Tengo una consulta como esta:
SELECT * FROM Cases WHERE created_at BETWEEN '2013-05-01' AND '2013-05-01'
Pero esto no da resultados a pesar de que hay datos en el 1er.
created_at
parece 2013-05-01 22:25:19
, sospecho que tiene que ver con el tiempo? ¿Cómo podría resolverse esto?
Funciona bien si hago rangos de fechas más grandes, pero también debería (inclusive) funcionar con una sola fecha.
sql
sql-server
sql-server-2008
tsql
date
JBurace
fuente
fuente
Respuestas:
Que es inclusiva. Estás comparando fechas y horas con fechas. La segunda fecha se interpreta como la medianoche cuando comienza el día .
Una forma de solucionar esto es:
Otra forma de solucionarlo es con comparaciones binarias explícitas.
Aaron Bertrand tiene una larga entrada en el blog sobre fechas ( aquí ), donde analiza este y otros problemas de fechas.
fuente
dateadd
para obtener el día siguiente.set dateformat dmy;select month(cast('2013-05-01' as datetime)); =1
>=
) y abierto en el otro (<
) combinado con la comprobación un día más allá de la fecha de finalización especificada.where
cláusula, ya que perderá cualquier indexación que tenga. Es un patrón realmente malo.Se supone que la segunda referencia de fecha en la
BETWEEN
sintaxis se considera mágicamente como el "final del día", pero esto no es cierto .es decir, esto se esperaba:
pero lo que realmente pasa es esto:
Que se convierte en el equivalente de:
El problema es uno de percepciones / expectativas sobre
BETWEEN
el que no incluyen tanto el valor más bajo y los valores superiores de la gama, pero no mágicamente hacer una fecha en que el "inicio de la" o "final de".BETWEEN
debe evitarse al filtrar por rangos de fechas.Utilice siempre el
>= AND <
lugarlos paréntesis son opcionales aquí pero pueden ser importantes en consultas más complejas.
fuente
Debe hacer una de estas dos opciones:
between
condición:... where created_at between '2013-05-01 00:00:00' and '2013-05-01 23:59:59'
(no recomendado ... vea el último párrafo)between
. Tenga en cuenta que luego deberá agregar un día al segundo valor:... where (created_at >= '2013-05-01' and created_at < '2013-05-02')
Mi preferencia personal es la segunda opción. Además, Aaron Bertrand tiene una explicación muy clara de por qué debería usarse.
fuente
BETWEEN
para consultas de rango de fechas que incluyan tiempo; demasiado puede salir mal.Simplemente use la marca de tiempo como fecha:
fuente
'DATE' is not a recognized built-in function name.
necesita convertir stackoverflow.com/a/20973452/4233593Creo que la mejor solución para comparar un campo de fecha y hora con un campo de fecha es la siguiente:
Esto es equivalente a una declaración entre inclusiva, ya que incluye tanto la fecha de inicio como la de finalización, así como las que se encuentran entre ellas.
fuente
Eso funcionará solo en 2008 y versiones más recientes de SQL Server
Si está utilizando una versión anterior, use
fuente
convert(varchar, created_at, 101)
El resultado es comodd/MM/yyyy
y las cadenas de OP sonyyyy-MM-dd
, creo que esta respuesta no funcionará;).Puede usar la
date()
función que extraerá la fecha de una fecha y hora y le dará el resultado como fecha inclusiva:fuente
Fecha dinámica entre la consulta sql
fuente