¿Cómo consultar el campo DATETIME usando solo la fecha en Microsoft SQL Server?

88

Tengo una tabla TEST con un DATETIMEcampo, como este:

ID NAME DATE
1 TESTING 2014-03-19 20:05:20.000

Lo que necesito es una consulta que devuelva esta fila y cada fila con la fecha 19/03/2014, sin importar la hora. Intenté usar

select * from test where date = '03/19/2014';

Pero no devuelve filas. La única forma de hacerlo funcionar que encontré es proporcionar también la parte de tiempo de la fecha:

select * from test where date = '03/19/2014 20:03:02.000';
delphirules
fuente

Respuestas:

126

use range, o función DateDiff

 select * from test 
 where date between '03/19/2014' and '03/19/2014 23:59:59'

o

 select * from test 
 where datediff(day, date, '03/19/2014') = 0

Otras opciones son:

  1. Si tiene control sobre el esquema de la base de datos y no necesita los datos de tiempo, elimínelos.

  2. o, si debe conservarlo, agregue un atributo de columna calculado que tenga la parte de tiempo del valor de fecha eliminado ...

Alter table Test Add DateOnly As DateAdd(day, datediff(day, 0, date), 0)

o, en versiones más recientes de SQL Server ...

Alter table Test Add DateOnly As Cast(DateAdd(day, datediff(day, 0, date), 0) as Date)

luego, puede escribir su consulta de la manera más sencilla:

select * from test 
where DateOnly = '03/19/2014'
Charles Bretana
fuente
Ok, esto funciona, pero me preguntaba si hay alguna forma más fácil.
Delphirules
Bueno, la única otra manera más fácil es no poner datos de tiempo en la base de datos en primer lugar ... o crear un atributo calculado que elimine la porción de tiempo y usarlo ... Agregué ambas opciones a mi respuesta.
Charles Bretana
Me preocupaba que el método DATEDIFF devolviera verdadero (indeseablemente) para fechas como 19/4/2014 o 19/03/2015, ya que la parte del 'día' de esas fechas es la misma (y había visto informes en otros lugares de que actuar de esta manera), pero lo probé con una base de datos y parece funcionar correctamente.
mono código
Sí, porque la DateDiff()función, en todas sus variantes, calcula y devuelve el número de límites de fechas que se deben cruzar para pasar de una fecha a otra. Por eso DateDiff(day, '1Jan2016', '31Dec2017 23:259:59')y DateDiff(day, '31Dec2016 23:259:59', '1Jan2017 ') ambos regresan 1.
Charles Bretana
55

Respuesta simple;

select * from test where cast ([date] as date) = '03/19/2014';
kabcha
fuente
Si bien esta es una respuesta válida, quiero señalar que poner el campo de fecha evaluando detrás de cualquier función conducirá a problemas de rendimiento. Cualquier índice en la fecha será inútil y el motor deberá evaluar cada fila
jean
7
select * from test 
where date between '03/19/2014' and '03/19/2014 23:59:59'

Esta es una respuesta realmente mala . Por dos razones.

1. ¿Qué sucede con tiempos como 23.59.59.700, etc. Hay tiempos mayores a 23:59:59 y al día siguiente.

2. El comportamiento depende del tipo de datos. La consulta se comporta de manera diferente para los tipos datetime / date / datetime2.

Probar con 23: 59: 59.999 lo empeora aún más porque, dependiendo del tipo de fecha, obtienes diferentes redondeos.

select convert (varchar(40),convert(date      , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime  , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime2 , '2014-03-19 23:59:59.999'))

- Para la fecha, el valor es 'picado'. - Para la fecha y hora, el valor se redondea a la fecha siguiente. (Valor más cercano). - Para datetime2, el valor es preciso.

Ben
fuente
7

Esto funciona para mí para el servidor MS SQL:

select * from test
where 
year(date) = 2015
and month(date) = 10
and day(date)= 28 ;
Jeroen Krah
fuente
1

Prueba esto

 select * from test where Convert(varchar, date,111)= '03/19/2014'
Amit
fuente
1

puedes probar esto

select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';
Infierno
fuente
1
Gracias, pero creo que la solución más simple sería una comparación con el tiempo, al igual que la solución anterior.
Delphirules
0

Puede utilizar este enfoque que trunca la parte de tiempo:

select * from test
where convert(datetime,'03/19/2014',102) = DATEADD(dd, DATEDIFF(dd, 0, date), 0)
Tim Schmelter
fuente
0
-- Reverse the date format
-- this false:
    select * from test where date = '28/10/2015'
-- this true:
    select * from test where date = '2015/10/28'
Sherif Hamdy
fuente
1
¡Agregue alguna explicación a su respuesta!
ρss
Esto no funciona porque '2015/10/28 00: 00.001' es diferente de '2015/10/28'
PedroC88
0

Simplemente use esto en su WHEREcláusula.

La parte "SubmitDate" a continuación es el nombre de la columna, así que inserte el suyo.

Esto devolverá solo la parte "Año" de los resultados, omitiendo los minutos, etc.

Where datepart(year, SubmitDate) = '2017'
usuario8161541
fuente
0
select *, cast ([col1] as date) <name of the column> from test where date = 'mm/dd/yyyy'

"col1" es el nombre de la columna con fecha y hora
<nombre de la columna> aquí puede cambiar el nombre como desee

NGoyal
fuente
0
select *
  from invoice
 where TRUNC(created_date) <=TRUNC(to_date('04-MAR-18 15:00:00','dd-mon-yy hh24:mi:ss'));
PanSQL
fuente
0

Existe un problema con las fechas y los idiomas y la forma de evitarlo es pidiendo fechas con este formato AAAAMMDD.

Esta forma a continuación debería ser la más rápida según el enlace a continuación. Revisé SQL Server 2012 y estoy de acuerdo con el enlace.

select * from test where date >= '20141903' AND date < DATEADD(DAY, 1, '20141903');
mako
fuente
0

utilizar esta

select * from TableName where DateTimeField > date() and  DateTimeField < date() + 1
akhil
fuente
-1

Prueba esta consulta.

SELECT *,DATE(chat_reg_date) AS is_date,TIME(chat_reg_time) AS is_time FROM chat WHERE chat_inbox_key='$chat_key' 
                         ORDER BY is_date DESC, is_time DESC
Programer_saeed
fuente
-1
select * from invoice where TRANS_DATE_D>= to_date  ('20170831115959','YYYYMMDDHH24MISS')
and TRANS_DATE_D<= to_date  ('20171031115959','YYYYMMDDHH24MISS');
khairollah royesh
fuente
Creo que esta es la sintaxis de Oracle, no funciona en el servidor SQL
ceinmart
-2
SELECT * FROM test where DATEPART(year,[TIMESTAMP]) = '2018'  and  DATEPART(day,[TIMESTAMP]) = '16' and  DATEPART(month,[TIMESTAMP]) = '11'
Kalidas
fuente