Como pesquisar o campo DATETIME usando apenas a data no servidor SQL?
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 !
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:
Se você tem controle sobre o esquema de banco de dados, e você não precisa do dados temporais, tirem-no.
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)
select * from test
where DateOnly = '03/19/2014'
Resposta simples;
select * from test where cast ([date] as date) = '03/19/2014';
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
Tenta isto
select * from test where Convert(varchar, date,111)= '03/19/2014'
select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';
select * from test
where date between '03/19/2014' and '03/19/2014 23:59:59'
Esta é uma resposta real má. 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.
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)
-- Reverse the date format
-- this false:
select * from test where date = '28/10/2015'
-- this true:
select * from test where date = '2015/10/28'
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');
Cumprimentos.
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
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'
Isto funciona para mim no servidor de MS SQL:
select * from test
where
year(date) = 2015
and month(date) = 10
and day(date)= 28 ;
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
select *
from invoice
where TRUNC(created_date) <=TRUNC(to_date('04-MAR-18 15:00:00','dd-mon-yy hh24:mi:ss'));
select * from invoice where TRANS_DATE_D>= to_date ('20170831115959','YYYYMMDDHH24MISS')
and TRANS_DATE_D<= to_date ('20171031115959','YYYYMMDDHH24MISS');