Estou tentando executar uma consulta simples para obter todas as linhas criadas em novembro:
SELECT COUNT(*)
FROM dbo.profile
WHERE [Created] BETWEEN '2014-11-01 00:00:00.000'
AND '2014-11-30 23:59:59.997';
O SMSS retorna:
A conversão de um tipo de dados varchar para um tipo de dados datetime resultou em um valor fora do intervalo.
Não entendo por que os dados estão sendo convertidos de varchar para datetime quando 'Created' é definido como datetime:
Preciso informar ao servidor que 'Criado' é datetime? Caso contrário, por que estou recebendo essa mensagem varchar?
Editar: o valor no banco de dados era YYYY-MM-DD
. A resposta do @SqlZim abaixo diz que preciso usar convert () para informar ao sql qual o formato da data no db - e substituir o caractere de espaço pela letra T:
select count(*)
from dbo.profile
where [created] between convert(datetime,'2014-11-01T00:00:00.000')
and convert(datetime,'2014-11-30T23:59:59.997');`
fonte
CONVERT(DATE, '20141201')
se sua necessidade de ser explícita substituísse todo o resto. Por outro lado, se a coluna subjacente for do tipo data / hora, isso não é realmente necessário. Você dizWHERE Active = CONVERT(BIT, 1)
para evitarWHERE Active = 1
ser interpretado como umINT
?o código abaixo, obtém a sessão atual
dateformat
, obtém um erro ao converter para datetime, depois define o formato da data comoymd
e por último, mas não menos importante, teste a conversão (conversão) novamente e funcionafonte