2009-12-22 24 views
36

¿Cómo puedo seleccionar 12/20/2008 en where cláusula de sql?Fecha y hora en donde la cláusula

El servidor es el servidor SQL 2005.

select * from tblErrorLog 
where errorDate = '12/20/2008' 
+0

¿Qué tipo de datos es la columna 'errorDate'? –

+2

El código anterior debería funcionar si el tipo de datos de columna es de hecho el de fecha y hora. – ryanulit

+5

El código anterior no funcionará si el formato de fecha en el servidor SQL no está configurado en EE. UU. Use el siguiente método {ts} para la independencia del lugar. –

Respuesta

10

Usted no dice qué base de datos que está utilizando, pero en MS SQL Server Sería

WHERE DateField = {d '2008-12-20'} 

Si se trata de un campo de marca de tiempo a continuación, se necesita un rango:

WHERE DateField BETWEEN {ts '2008-12-20 00:00:00'} AND {ts '2008-12-20 23:59:59'} 
+0

es el servidor sql. –

+0

No funciona como se describe/requiere en MS SQL Server 2005, acabo de probarlo. Sorprendentemente es válido, simplemente te da resultados donde la fecha es la anterior, y la hora es 00:00:00 – Meff

+0

Gracias, la pregunta original apareció como si fuera solo un campo de fecha sin tiempos. Han agregado un rango para campos de fecha y hora. –

53
WHERE datetime_column >= '20081220 00:00:00.000' 
    AND datetime_column < '20081221 00:00:00.000' 
+2

Esto no funciona, las fechas deben ser '2008-2012' si está utilizando este enfoque. (aaaa-dd-mm) Este sería el formato correcto si usa los {ts} identificadores. –

+0

Depende de la configuración regional; aaaa-mm-dd funciona en la mayoría de los lugares, pero no es * totalmente * seguro como una representación de fecha. Aaron Bertrand tiene todos los detalles http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx – onupdatecascade

+0

@_J_: The 'yyyy El formato -MM-dd' * does * funciona en la mayoría de las circunstancias, pero no en todas. @onupdatecascade: tienes razón. Actualicé mi respuesta para usar un formato seguro en todas las circunstancias. – LukeH

1
select * from tblErrorLog 
where errorDate BETWEEN '12/20/2008' AND DATEADD(DAY, 1, '12/20/2008') 
18

En primer lugar, recomendaría utilizar el formato estándar ISO-8601 para fecha/hora; funciona independientemente del idioma y la configuración regional en su servidor SQL. ISO-8601 es el formato YYYYMMDD - sin espacios, sin guiones - sólo los datos:

select * from tblErrorLog 
where errorDate = '20081220' 

En segundo lugar, es necesario tener en cuenta que SQL Server 2005 DATETIME siempre incluye la vez. Si busca una coincidencia exacta con solo la parte de la fecha, obtendrá solo las filas que coincidan con una hora de 0:00:00, nada más.

Puede utilizar cualquiera de los recomiendan las búsquedas por rangos mencionados, o en SQL Server 2008, puede utilizar el tiempo DATE única fecha - o usted podría hacer una verificación de algo como:

select * from tblErrorLog 
where DAY(errorDate) = 20 AND MONTH(errorDate) = 12 AND YEAR(errorDate) = 2008 

Cualquiera que sea la que mejor funciona para ti.

Si lo que necesita hacer esta consulta a menudo, se puede o bien tratar de normalizar la DATETIME para incluir sólo la fecha, o se puede añadir columnas calculadas por día, mes y año:

ALTER TABLE tblErrorLog 
    ADD ErrorDay AS DAY(ErrorDate) PERSISTED 
ALTER TABLE tblErrorLog 
    ADD ErrorMonth AS MONTH(ErrorDate) PERSISTED 
ALTER TABLE tblErrorLog 
    ADD ErrorYear AS YEAR(ErrorDate) PERSISTED 

y luego podría consultar más fácilmente:

select * from tblErrorLog 
where ErrorMonth = 5 AND ErrorYear = 2009 

y así sucesivamente. Dado que esos campos se calculan y PERSISTEN, siempre están actualizados y siempre actualizados, y como están vigentes, incluso puede indexarlos si es necesario.

4

Utilice una función de conversión para obtener todas las entradas de un día en particular.

Select * from tblErrorLog where convert(date,errorDate,101) = '12/20/2008' 

Ver CAST and CONVERT para obtener más información

+0

Esto no es una buena manera para hacerlo porque los índices no se pueden usar si se usa convertir para la columna –

6

Suponiendo que estamos hablando DateTime de SQL Server

Nota: ENTRE incluye ambos extremos del rango, por lo que técnicamente este patrón se equivoca:

errorDate BETWEEN '12/20/2008' AND '12/21/2008' 

Mi método preferido para un intervalo de tiempo como este es:

'20081220' <= errorDate AND errordate < '20081221' 

Funciona con índices comunes (escaneo de rango, SARGable, sin función) y recorta correctamente la medianoche del día siguiente, sin depender de la granularidad de tiempo de SQL Server (p. 23: 59: 59.997)

+0

Parece que tengo un par de votos abajo sobre esto, y me pregunto por qué. Si no crees que esta solución funciona, ¡por favor, enséñame! – onupdatecascade

+0

Bueno, acabo de buscar esto en algún momento después de publicado originalmente, y he notado que no incluye el tiempo, y también que OP tampoco lo hizo, sin embargo, hace referencia a la granularidad de SQL. Aunque voté porque también uso este formato. – htm11h

Cuestiones relacionadas