Estoy tratando de ejecutar una consulta simple para obtener todas las filas creadas en noviembre:
SELECT COUNT(*)
FROM dbo.profile
WHERE [Created] BETWEEN '2014-11-01 00:00:00.000'
AND '2014-11-30 23:59:59.997';
SMSS devuelve:
La conversión de un tipo de datos varchar a un tipo de datos datetime dio como resultado un valor fuera de rango.
No entiendo por qué los datos se convierten de varchar a datetime cuando 'Creado' se establece en datetime:
¿Debo decirle al servidor que 'Creado' es fecha y hora? Si no, ¿por qué recibo este mensaje varchar?
Editar: el valor en la base de datos era YYYY-MM-DD
. La respuesta de @SqlZim a continuación dice que necesito usar convert () para decirle a sql qué formato tiene la fecha en la base de datos, y reemplazar el carácter de espacio con la 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');`
fuente
CONVERT(DATE, '20141201')
si tu necesidad de ser explícito anulara todo lo demás. Por otra parte, si la columna subyacente es un tipo de fecha / hora, esto no es realmente necesario. ¿DicesWHERE Active = CONVERT(BIT, 1)
para evitarWHERE Active = 1
ser interpretado como unINT
?el siguiente código, obtiene la sesión actual
dateformat
, obtiene un error cuando se convierte a datetime, luego establece el formato de fecha enymd
y por último, pero no menos importante, prueba la conversión (conversión) nuevamente y funcionafuente