Eu tenho uma consulta como esta:
SELECT * FROM Cases WHERE created_at BETWEEN '2013-05-01' AND '2013-05-01'
Mas isso não dá resultados, mesmo que haja dados no 1º.
created_at
parece 2013-05-01 22:25:19
, eu suspeito que tem a ver com o tempo? Como isso poderia ser resolvido?
Funciona muito bem se eu fizer períodos maiores, mas também deve funcionar com uma única data.
sql
sql-server
sql-server-2008
tsql
date
JBurace
fonte
fonte
Respostas:
Ele é inclusiva. Você está comparando datas e datas. A segunda data é interpretada como meia-noite quando o dia começa .
Uma maneira de corrigir isso é:
Outra maneira de corrigi-lo é com comparações binárias explícitas
Aaron Bertrand tem uma entrada longa no blog sobre datas ( aqui ), onde ele discute esse e outros problemas de datas.
fonte
dateadd
para obter o dia seguinte.set dateformat dmy;select month(cast('2013-05-01' as datetime)); =1
>=
) e aberto na outra (<
) combinado com a verificação de um dia além da data final especificada.where
cláusula, pois ela perderá qualquer indexação. É um padrão muito ruim.Supõe-se que a segunda referência de data na
BETWEEN
sintaxe é magicamente considerada o "fim do dia", mas isso não é verdade .isto é esperado:
mas o que realmente acontece é isso:
Que se torna o equivalente a:
O problema é uma das percepções / expectativas sobre
BETWEEN
o que não incluir tanto o valor mais baixo e os valores superiores da gama, mas não magicamente fazer uma data de "início de" ou "o fim da".BETWEEN
deve ser evitado ao filtrar por períodos.Sempre usar a
>= AND <
vezos parênteses são opcionais aqui, mas podem ser importantes em consultas mais complexas.
fonte
Você precisa fazer uma destas duas opções:
between
condição:... where created_at between '2013-05-01 00:00:00' and '2013-05-01 23:59:59'
(não recomendado ... consulte o último parágrafo)between
. Observe que você precisará adicionar um dia ao segundo valor:... where (created_at >= '2013-05-01' and created_at < '2013-05-02')
Minha preferência pessoal é a segunda opção. Além disso, Aaron Bertrand tem uma explicação muito clara sobre por que deve ser usado.
fonte
BETWEEN
para consultas de período que incluem hora; demais pode dar errado.Basta usar o carimbo de data / hora como data:
fonte
'DATE' is not a recognized built-in function name.
precisa converter stackoverflow.com/a/20973452/4233593Acho que a melhor solução para comparar um campo de data e hora com um campo de data é a seguinte:
Isso é equivalente a uma instrução inclusiva entre, pois inclui a data de início e término, bem como as que se situam entre elas.
fonte
Isso funcionará apenas em 2008 e em versões mais recentes do SQL Server
Se você estiver usando uma versão mais antiga, use
fonte
convert(varchar, created_at, 101)
resultado é comodd/MM/yyyy
e cordas do OP sãoyyyy-MM-dd
, acho que esta resposta não vai funcionar;).Você pode usar a
date()
função que extrairá a data de uma data e hora e fornecerá o resultado como data inclusiva:fonte
Data dinâmica entre a consulta sql
fonte