J'essaie d'exécuter une requête simple pour obtenir toutes les lignes créées en novembre:
SELECT COUNT(*)
FROM dbo.profile
WHERE [Created] BETWEEN '2014-11-01 00:00:00.000'
AND '2014-11-30 23:59:59.997';
SMSS renvoie:
La conversion d'un type de données varchar en un type de données datetime a entraîné une valeur hors plage.
Je ne comprends pas pourquoi les données sont converties de varchar en datetime lorsque 'Created' est défini sur datetime:
Dois-je dire au serveur que «Créé» est datetime? Sinon, pourquoi reçois-je ce message varchar?
Modifier: la valeur dans la base de données était YYYY-MM-DD
. La réponse de @SqlZim ci-dessous indique que je dois utiliser convert () pour indiquer à sql le format de la date dans la base de données - et pour remplacer le caractère espace par la lettre 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');`
CONVERT(DATE, '20141201')
si votre besoin d'être explicite l'emportait sur tout le reste. Là encore, si la colonne sous-jacente est de type date / heure, ce n'est pas vraiment nécessaire. Dites-vousWHERE Active = CONVERT(BIT, 1)
d'éviterWHERE Active = 1
d'être interprété comme unINT
?