J'ai cette colonne startmmonth em> des tables, qui aime ceci: yyyymm fort>, donc 201801 strong>, 201707 fort> etc. Je veux cette colonne à mon avis que je crée, mais que je crée, mais converti en une date, comme aaaa-mm-mm-dd fort> avec la journée comme le premier du mois, alors ** 201801> 2018-01-01 et 201707> 2017-07-01. ** p> Je continue à obtenir l'erreur: p> La conversion a échoué lors de la conversion de la date et / ou du temps de caractère
chaîne. p>
BlockQuote> Quelqu'un peut-il m'aider? P> J'ai essayé ceci: p>
3 Réponses :
Essayez d'utiliser ou p> Cast and Convert (Transact-SQL) P > Je pense mieux utiliser et try_convert code> ici comme indiqué @Larnu: p> + code> au lieu de < Code> Concat code> Pour convertir les valeurs nulelles correctement. p> p>
Toujours obtenir exactement la même erreur. Ils travaillent sans les déclarations de jointure, mais pas avec les jointures.
Essayez de vérifier startmmonth + 01 code> à l'aide de isdate code> - Sélectionnez ISDate ('20120101'), ISDate ('20121301') code>
Le code doit fonctionner sans le paramètre de style. Vous avez simplement de mauvaises données ... 201913 code>, foobar code> etc.
@ user11299833 - Sélectionnez s. * à partir de facturation_subscription S Où est isdate (concat (S.StartMonth, '01 ')) = 0 code>
Est l'aversion isdate code>, @sergeymenshov. Par exemple, Sélectionnez ISDate (2017); code> retourne 1, mais Sélectionnez Convert (date, 2017); code> échouera. try_convert code> est un outil bien meilleur.
@Larnu - oui, try_convert code> est meilleur.
@Larnu - Sélectionnez Cast ('2017' comme date), Convertir (date, '2017') code>
2017 code>, pas '2017' code> @Sergeymenshov
@Larnu - Oui, mais dans la question, il est Varchark non int.
Oui, mais mon point est que isdate code> fournit de faux positifs (et faux négatifs, comme isdate ('') code> renvoie 0 code>, mais Convertir (date, '') code> travaux); Tout comme isnumeric code> fait. Ils devraient être évités car ils ne sont pas fiables. Juste parce que isdate code> renvoie 1 code> ne signifie pas que la valeur sera capable d'être coulé / convertie, et simplement parce qu'elle renvoie 0 code> ne signifie pas ça ne peut pas..
@Larnu - Oui, je suis d'accord avec vous que isdate code> n'est pas une bonne variante. C'est obsolète.
Le problème est que vous faites une jointure gauche sur la table avec la chaîne qui signifie qu'il peut parfois être null s'il n'y a pas de ligne correspondante pour un incident Voici un moyen de résoudre ce p> incident code>, puis la conversion échoue SELECT CASE WHEN s.StartMonth IS NOT NULL THEN convert(DATE, concat (s.StartMonth,'01'), 112)
ELSE null -- Or return some default value, otherwise this row can be removed
END as SubscriptionStart
FROM incident i
LEFT JOIN imcustomerid cid ON i.accountid = cid.accountid
LEFT JOIN billing_subscription s ON cid.imcustomerid = s.idcustomer
LEFT JOIN billing_subscriptiontype st ON s.idsubscriptiontype = st.id
Convert (date, null) code> retourne null code>. Cela ne résoudra pas le problème. try_convert code> arrêtera le SQL de fournir une erreur, mais peut ne pas donner aux résultats souhaités.
@Larnu Où dois-je convertir sur une valeur null?
Pour être plus court, vous pouvez sauter sinon NULL code> ici.
@ Sergeymenshov Je sais mais je pensais qu'il serait plus clair que vous puissiez avoir un résultat par défaut. J'aurais peut-être ajouté un commentaire.
"signifie qu'il peut parfois être nul s'il n'y a pas de ligne de correspondance pour une ligne d'incident, puis la conversion échoue" i>. Vous dites que convert code> produira une erreur si la valeur à convertir a une valeur de null code>; ce n'est pas vrai. Cette requête produira toujours l'erreur que l'OP obtient en tant que cas code> code> est superflu. L'ensemble du cas code> pourrait être écrit comme convert (date, concat (S.StartMonth, '01 '), 112) code> et serait exactement le même résultat (et le serait donc Erreur, comme l'OP a clairement des valeurs qui ne sont pas dans le format yyyymm code>).
Parce que le problème est la valeur de s.startmonth code> quand ce n'est pas null code>.
Selon Op, la conversion fonctionne bien sans rejoindre, cela convient à chaque rangée de cette colonne qui existe dans la table, et c'est ce que je baste sur ma réponse.
Je pense que la méthode la plus claire est La manière la plus traditionnelle est simplement de soustraire un certain nombre de jours: P> Datefromparts () Code>: select dateadd(day,
(1 - day(s.StartMonth)),
s.StartMonth
) as SubscriptionStart
Êtes-vous sûr que c'est mysql?
Votre code fonctionne bien pour moi avec
102 code> et112 code> comme type lors de l'utilisation d'une chaîne de code papier au lieu de la colonne (I.E '201811'). Quel type est démarrage? Pourrait-il contenir des espaces?Remarque, la date code> code> DataType n'a pas de format; Date (heure) Les fichiers de données sont stockés comme une représentation binaire. Votre couche de présentation choisit le format La date est affichée dans (par exemple, SSMS utilise
AAAAYY-MM-DD CODE> Par défaut pour la plupart des utilisateurs).@ Joakimdanielson Nope, pas d'espaces. Quand j'essaie de le convertir avec 'de billing_subscription s' (donc sans les jointures), cela fonctionne très bien, alors je ne comprends pas bien pourquoi cela ne fonctionnera pas lors de l'ajout de certaines jointures.
Ajoutez les résultats pour
Sélectionnez StartMonth à partir de facturation_subscription où TRY_CONVERT (Date, Concat (StartMonth, '01 ')) est NULL et STARTMONTH n'est pas NULL; code>. Je soupçonne que vos données ne sont pas comme toutes dans le formatyyyymm code>.Je suis d'accord aussi bien, bien que le code de style
102 code> est défini commeyyyy.mm.dd code>, il fonctionne pour'100001' code> à" 233012 ' Code>: dB <.Fiddle a>. Si nous ne pouvons pas reproduire le problème, nous ne pouvons pas vous aider.