SQL Server trop heureux d'append le jour et le mois

Je commence avec cette requête.

select count(datepart(day, SomeTime)) as NumberOf, datepart(day, SomeTime) as DaySansMonth from PMStationTightenings group by datepart(day, SomeTime) 

Il fait ce qui est supposé mais pas commodément présenté. Donc, je le remodel pour inclure le mois aussi.

 select count(datepart(day, SomeTime)) as NumberOf, datepart(month, SomeTime) + ' ' + datepart(day, SomeTime) as DayAndMonth from PMStationTightenings group by datepart(month, SomeTime) + ' ' + datepart(day, SomeTime) 

L'ordinateur essaie d'être intelligent et ajoute les nombres de toute façon, donc au lieu de par exemple 8 5, je reçois 13 . Moins que parfait. Pourquoi? (Je comprends qu'il interprète les deux nombres comme des entiers, bien sûr, mais pourquoi? Il y a clairement un espace entre …)

En tout cas, je vais de l'avant et je fais du sortingp mais je mets des choses que je ne peux pas append. Maintenant, je pense à moi-même "HA! Croiriez-vous que l'ordinateur stupide m'aboie en jetant ces vilaines choses rouges comme si je devais faire une erreur. Incroyable! Quel nerf! 🙂

 select count(datepart(day, SomeTime)) as NumberOf, datepart(month, SomeTime) + '|' + datepart(day, SomeTime) as DayAndMonth from PMStationTightenings group by datepart(month, SomeTime) + '|' + datepart(day, SomeTime) 

Comment puis-je faire l'ordinateur par b! "# ¤ et le forcer à me donner un combo mois / jour de la DB?

Comme Jim a déjà expliqué comment vous pouvez résoudre ce problème , voici le WHY .

Citant à partir de la préséance de type de données de SQL Server :

Lorsqu'un opérateur combine deux expressions de types de données différents, les règles de priorité de type de données spécifient que le type de données de priorité inférieure est converti en type de données avec la priorité la plus élevée. Si la conversion n'est pas une conversion implicite prise en charge, une erreur est renvoyée.

Vous DATEPART INT (valeur de return à partir de DATEPART ) et (N) VARCHAR , mais INT a priorité plus élevée que (N) VARCHAR ), SQL Server essaye de traiter le tout comme INT .

En général, vous devriez essayer d'éviter les conversions implicites et être aussi explicite que possible si vous traitez différents types de données dans une même expression. Il suffit donc de convertir / convertir vos valeurs dans le type approprié.

EDIT: partie corrigée sur les types de données impliqués, due à Anthony Grist

Essayez de convertir la valeur en un varchar:

 CAST(datepart(month, SomeTime) AS VARCHAR(2)) + ' ' + CAST(datepart(day, SomeTime) AS VARCHAR(2))