7
votes

Comment obtenir le mois d'une chaîne en SQL?

Je dois obtenir le mois à partir d'une colonne qui stocke la chaîne en forme - xxx

donc si la valeur était 'feb2007' alors je dois revenir 2 ou bien si la valeur était 'sep2009' alors je dois récupérer 9 .

y a-t-il une fonction intégrée dans SQL Server 2008 pour atteindre quelque chose comme ça?


5 commentaires

Les valeurs sont stockées dans une liste séparée par des virgules?


Non, cela vient de stocker comme une entrée. Je veux dire une ligne a une valeur feb2007, puis la deuxième ligne a la valeur Sep2008


J'espère que vous ne stockez pas les citations ' dans la colonne! Les dates de Varcharis sont assez mauvaises!


J'espère qu'il n'y a pas de Sept2008 CORDES IN :)


Ya..Je n'aime pas ... Je travaille avec une base de données héritée qui a des dates de Varchark et de demander à changer quelque chose est Blashphemy!


7 Réponses :


9
votes

Essayez ceci:

select datepart(mm, cast('feb2008' as datetime))


3 commentaires

Je suppose que cela dépend vraiment des paramètres régionaux. Je parie qu'il peut être possible pour SQL Server de ne pas reconnaître cette chaîne comme date.


Je frissons toujours quand quelqu'un stocke une date / heure comme Varchar / etc plutôt que le type de données de date / heure indigène ...


@OMG Ponies Qu'en est-il de l'importation XML sans XSD ci-joint? Ou Excel Data connectés à votre serveur SQL? Ou peu importe. Ces problèmes sont pair pour le cours.



1
votes

Si rien d'autre, vous pouvez créer une table avec vos noms mois et vos valeurs numériques.

Si la fonction Server reconnaît toujours vos noms de mois correctement, vous êtes bon, mais si l'une de ces données était entrée manuellement, il pourrait y avoir des mal orthographiques ou d'autres incohérences, et une table vous permettrait de les supporter.


0 commentaires

3
votes

aussi ceci:

Sélectionnez le mois (Cast (Date_Col en tant que DateTime))


1 commentaires

Ou juste sélectionnez le mois ('sep2008')



0
votes

Je suis tout à fait d'accord avec Beth ici - mais avec des justifications quant à la raison pour laquelle cela devrait être fait par opposition à un dernier recours:

Les données doivent être stockées dans son format natif. Vous ne devriez plus le stocker comme une chaîne que vous en devoir un entier 8 bits. Cela fait tout autant / peu de sens. SQL est une bête très intelligente, mais si vous bousillez vos types de données fondamentaux, la plupart de ses fonctionnalités utiles et heuristiques sortent de la fenêtre - même des trucs de base comme indexation et Tri . Sans parler de vos données devient SQL Server Explicit (c.-à-d. Repose sur certains comportements SQL) par opposition au générique, réduisant la portabilité.

Pour le mettre en termes plus formels: vous le forcez à devenir des informations sur la couche de données. C'est une antithèse à toutes les règles connues de la manipulation de données.


0 commentaires

0
votes
SELECT month(column);
This should work, it's been a while since I've used SQL Server, though.

0 commentaires

0
votes
    datepart(month,getdate())

0 commentaires

0
votes

Peut-être besoin de revoir votre conception de base de données, si possible. Beaucoup plus efficace pour la convertir en DateTime avant de stocker dans la table. Par exemple, la recherche d'une gamme de dates prendra beaucoup plus de temps qu'elle n'aura besoin, car vous devrez lancer chaque valeur distincte avant de trouver les dates de votre gamme.


0 commentaires