Comment utiliser entre la clause d'obtention des données entre deux dates?
J'ai du champ de date dans la base de données dans le format 2012-03-17 19:50:08.023.
Je veux créer une requête sélection qui me donne les données recueillies dans le Mars mois.
Mais je ne suis pas en mesure d'atteindre cet.
Je suis en train requête suivante.
select * from OrderHeader where
Convert(varchar,UploadDt,103) between '01/03/2013' and '31/03/2013'
and DistUserUniqueID like '6361%'
Cette requête me donne les données pour toutes les dates.
select * from OrderHeader where
UploadDt between '01/03/2013' and '31/03/2013' and DistUserUniqueID like '6361%'
Cette requête me donne l'erreur que Msg 242, Niveau 16, État 3, Ligne 1
La conversion d'un type de données varchar à un type de données datetime entraîné dans une gamme de valeur.
Merci de m'aider à résoudre ce problème.
Merci d'avance
- Utilisez varchar (11). Spécifier la longueur
Vous devez vous connecter pour publier un commentaire.
La première requête renvoie toutes les dates parce que vous êtes la conversion de votre colonne d'une chaîne de caractères. Pas sûr de savoir pourquoi vous faites cela. Donc quand vous dites que
BETWEEN '01/anything' AND '31/anything'
, quand vous considérez qu'il est maintenant juste une chaîne, qui va correspondre à tous les "dates" dans la colonne, quel que soit le mois et l'année, depuis votreWHERE
clause de recouvrir tous les jours (enfin, à l'exception de tous les 31 du mois autre que Mars, et le premier jour de janvier et de février donc pas toutes les données mais un très grand pourcentage).'15/11/2026'
, par exemple, estBETWEEN '01\03\2013' AND '31/03/2013'
.Pensez-y une seconde. Vous avez datetime données dans votre base de données, et vous voulez les convertir en une chaîne à l'avant de l'interroger. Souhaitez-vous également de convertir salaire d'une chaîne de caractères avant de le comparer? Si oui, la personne qui, à 70 000 $va ressembler, ils font plus que de la personne qui fait $de 690 000, depuis caractère basé sur le tri commence à le premier caractère et ne tient pas compte de la longueur.
La deuxième requête échoue parce que vous êtes à l'aide de l'échelle régionale, ambigu format pour vos dates. Vous pouvez, comme
dd/mm/yyyy
mais clairement votre serveur est basé sur l'anglais AMÉRICAIN formatage oùmm/dd/yyyy
est prévu.La solution est d'utiliser un format clair, comme
YYYYMMDD
.Cependant vous ne devriez pas utiliser
ENTRE
- puisque c'est unDATETIME
colonne, vous devriez être en utilisant:(Sinon vous allez rater toutes les données de
2013-03-31 00:00:00.001
par2013-03-31 23:59:59.997
.)Si vous aimez vraiment
BETWEEN
puis sur 2008+ (vous n'avez pas de nous dire votre version), vous pouvez utiliser:Plus de la plage de dates requête conseils ici:
Enfin, lors de la conversion à
VARCHAR
(ou sur toute la longueur variable des types de données), toujours spécifier une longueur.Réécrire la requête en tant que
ou