Como consultar o campo DATETIME usando apenas data no Microsoft SQL Server?

88

Eu tenho uma tabela TEST com um DATETIMEcampo, assim:

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

O que preciso é de uma consulta retornando essa linha e cada linha com data 19/03/2014, não importa que hora seja. Tentei usar

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

Mas não retorna nenhuma linha. A única maneira de fazer funcionar que encontrei é fornecer também a parte da hora da data:

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

Respostas:

126

usar intervalo ou 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 do banco de dados e não precisa dos dados de tempo, remova-os.

  2. ou, se você deve mantê-lo, adicione um atributo de coluna computada que tem a parte do tempo do valor da data removida ...

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

ou, em versões mais recentes do SQL Server ...

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

então, você pode escrever sua consulta simplesmente:

select * from test 
where DateOnly = '03/19/2014'
Charles Bretana
fonte
Ok, isso funciona, mas eu queria saber se existe alguma maneira mais fácil.
delphirules de
Bem, a única outra maneira mais fácil é não colocar dados de tempo no banco de dados em primeiro lugar ... ou criar um atributo computado que retira a parte de tempo e a usa ... Eu adicionei as duas opções à minha resposta.
Charles Bretana
Eu estava preocupado que o método DATEDIFF retornasse verdadeiro (indesejável) para datas como 19/04/2014 ou 19/03/2015, já que a parte do 'dia' dessas datas é a mesma (e eu tinha visto relatórios em outros lugares que isso agir dessa forma), mas testei em um banco de dados e parece funcionar corretamente.
código mono de
Sim, porque a DateDiff()função, em todas as suas variantes, calcula e retorna o número de limites de datas que devem ser ultrapassados ​​para ir de uma data para a outra. É por isso DateDiff(day, '1Jan2016', '31Dec2017 23:259:59')e DateDiff(day, '31Dec2016 23:259:59', '1Jan2017 ') quer voltar 1.
Charles Bretana
55

Resposta simples;

select * from test where cast ([date] as date) = '03/19/2014';
kabcha
fonte
Embora esta seja uma resposta válida, quero apontar que colocar o campo de avaliação de data por trás de qualquer função levará a problemas de desempenho. Qualquer índice na data será inútil e o mecanismo precisará avaliar cada linha
Jean
7
select * from test 
where date between '03/19/2014' and '03/19/2014 23:59:59'

Esta é uma resposta muito ruim . Por duas razões.

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

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

Testar com 23: 59: 59.999 torna tudo ainda pior porque, dependendo do tipo de dados, você obtém arredondamentos diferentes.

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

Ben
fonte
7

Isso funciona para mim para o servidor MS SQL:

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

Tente isto

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

você pode tentar isso

select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';
Inferno
fonte
1
Obrigado, mas acho que a solução mais simples seria uma comparação com o tempo, assim como a solução anterior.
delphirules
0

Você pode usar esta abordagem que trunca a parte do tempo:

select * from test
where convert(datetime,'03/19/2014',102) = DATEADD(dd, DATEDIFF(dd, 0, date), 0)
Tim Schmelter
fonte
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
fonte
1
Por favor, adicione alguma explicação à sua resposta!
ρss
Isso não funciona porque '2015/10/28 00: 00.001' é diferente de '2015/10/28'
PedroC88
0

Simplesmente use isso em sua WHEREcláusula.

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

Isso retornará apenas a parte "Ano" dos resultados, omitindo os minutos etc.

Where datepart(year, SubmitDate) = '2017'
user8161541
fonte
0
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
<nome da coluna> aqui você pode alterar o nome como desejar

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

usa isto

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

Teste 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
fonte
-1
select * from invoice where TRANS_DATE_D>= to_date  ('20170831115959','YYYYMMDDHH24MISS')
and TRANS_DATE_D<= to_date  ('20171031115959','YYYYMMDDHH24MISS');
Khairollah royesh
fonte
Acho que esta é a sintaxe da Oracle, não funciona no servidor sql
ceinmart
-2
SELECT * FROM test where DATEPART(year,[TIMESTAMP]) = '2018'  and  DATEPART(day,[TIMESTAMP]) = '16' and  DATEPART(month,[TIMESTAMP]) = '11'
Kalidas
fonte