Como pesquisar o campo DATETIME usando apenas a data no servidor SQL?

É uma pergunta simples, mas ainda não a consigo resolver...

tenho um teste de tabela com um campo DATETIME, como este:

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

o que eu preciso é que a consulta abaixo devolve esta linha e todas as linhas com data = 19/03/2014, independentemente da hora:

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

mas não devolve linhas. A única maneira de trabalhar é especificar também o tempo:

select * from test where date = '03/19/2014 20:03:02.000';
Obrigado antecipadamente !

Author: Charles Bretana, 2014-03-19

15 answers

Usar o intervalo, ou a função DateDiff

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

Ou

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

Outras opções são:

  1. Se você tem controle sobre o esquema de banco de dados, e você não precisa do dados temporais, tirem-no.

  2. Ou, se você tiver que mantê-lo, adicione um atributo de coluna computada que tem a porção de tempo do valor da data retirado...

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

Ou, em versões mais recentes do servidor SQL...

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

Então, podes escrever. a sua pergunta é simples:
select * from test 
where DateOnly = '03/19/2014'
 73
Author: Charles Bretana, 2014-09-11 12:42:44

Resposta simples;

select * from test where cast ([date] as date) = '03/19/2014';
 32
Author: kabcha, 2015-01-16 18:19:35

Estou a usar o MySQL 5.6 e há uma função de data para extrair apenas a parte da data a partir da hora da data. Então a solução simples para a questão é -

 select * from test where DATE(date) = '2014-03-19';

Http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html

 16
Author: Goku__, 2015-07-01 07:06:18

Tenta isto

 select * from test where Convert(varchar, date,111)= '03/19/2014'
 2
Author: Amit, 2014-03-19 13:13:39
Podes tentar isto.
select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';
 1
Author: HeLL, 2014-03-19 14:11:49
select * from test 
where date between '03/19/2014' and '03/19/2014 23:59:59'

Esta é uma resposta real . Por duas razões.

1. O que acontece com os tempos como 23.59.59.700 etc. Há vezes maiores que 23: 59: 59 e no dia seguinte.

2. O comportamento depende do tipo de dados. A consulta se comporta de forma diferente para os tipos datetime/date/datetime2.

Testar com 23:59:59.999 torna-o ainda pior, porque dependendo do tipo de dados você tem diferentes Rondas.

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 a data, o valor é "picado". -- Para o datetime o valor é arredondado para a data seguinte. (Valor mais próximo). -- Para o datetime2, o valor é preciso.

 1
Author: Ben, 2017-03-06 16:42:39

Pode utilizar esta abordagem que trunca a parte temporal:

select * from test
where convert(datetime,'03/19/2014',102) = DATEADD(dd, DATEDIFF(dd, 0, date), 0)
 0
Author: Tim Schmelter, 2014-03-19 13:15:06
-- Reverse the date format
-- this false:
    select * from test where date = '28/10/2015'
-- this true:
    select * from test where date = '2015/10/28'
 0
Author: Sherif Hamdy, 2015-11-07 02:41:57

Há um problema com datas e Línguas e a maneira de evitar é pedir datas com este formato AAAAMMDD.

Este caminho abaixo deve ser o mais rápido de acordo com o link abaixo. Verifiquei no servidor SQL 2012 e concordo com o link.

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

Http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx

Cumprimentos.

 0
Author: mako, 2016-12-01 22:40:06

Testa 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
 0
Author: Programer_saeed, 2017-04-06 22:18:47

Basta usar isto na sua cláusula WHERE.

A parte" SubmitDate " abaixo é o nome da coluna, por isso insira o seu próprio.

Isto irá devolver apenas a parte "ano" dos resultados, omitindo os mins etc.

Where datepart(year, SubmitDate) = '2017'
 0
Author: user8161541, 2017-06-14 19:23:53

Isto funciona para mim no servidor de MS SQL:

select * from test
where 
year(date) = 2015
and month(date) = 10
and day(date)= 28 ;
 0
Author: Jeroen Krah, 2018-03-09 10:03:37
select *, cast ([col1] as date) <name of the column> from test where date = 'mm/dd/yyyy'

"col1" é o nome da coluna com data e hora
aqui poderá alterar o nome como desejar

 0
Author: NGoyal, 2018-04-20 07:32:31
select *
  from invoice
 where TRUNC(created_date) <=TRUNC(to_date('04-MAR-18 15:00:00','dd-mon-yy hh24:mi:ss'));
 0
Author: PanSQL, 2018-04-26 03:12:20
select * from invoice where TRANS_DATE_D>= to_date  ('20170831115959','YYYYMMDDHH24MISS')
and TRANS_DATE_D<= to_date  ('20171031115959','YYYYMMDDHH24MISS');
 -1
Author: khairollah royesh, 2017-09-05 07:13:35