Convertir VARCHAR pour SMALLDATETIME dans le cadre de l'instruction de mise à JOUR
Je suis exécution d'un bloc de données d'importation sur les fichiers CSV. Dans les fichiers CSV, mon 'Date' colonne contient une date au format 'YYYYDDMMHHMM" (par exemple, 200603010929).
Comme il est, si je sélectionne le "smalldatetime' lors de la création de la table, de l'importation de données échoue avec ce message d'erreur:
En vrac de charge erreur de conversion de données (incompatibilité de type ou de caractère non valide
pour la page de codes spécifiée) pour la ligne 2, colonne 2 (Date).
Si je comprends bien, pour qu'il fonctionne, la date doit être un certain format pour travailler.
Par conséquent, une idée que j'ai, c'est d'importer les valeurs de date dans un champ de type VARCHAR, puis lorsque l'importation est terminée, je veux effectuer une mise à JOUR sur chaque ligne pour convertir la date smalldatetime. Cela aurait pour effet d'allonger le processus d'importation, mais je pense qu'il serait beaucoup plus facile et beaucoup plus rapide que de tenter de faire une rechercher et remplacer sur les données au format CSV (c'est un énorme jeu de données).
Donc, ma question est:
1) Est-ce possible?
2) Comment puis-je mettre en œuvre?
C'est ce que j'ai à ce jour:
UPDATE NYSE
SET [date]=CONVERT(smalldatetime, [date])
Cela échoue, puisque le texte n'est pas du bon format. Est-il possible de spécifier le format de la chaîne à l'intérieur de la fonction de conversion, ou est-il un autre moyen?
J'apprécie tous les commentaires. Merci.
- Est-il vraiment YYYYDDMM et pas AAAAMMJJ? Donc 20060301 est le 3 janvier, et non le 1er Mars?
- Yup, c'est certainement YYYYDDMMHHMM, le 3 janvier. J'ai un autre jeu de données, qui est dans le format YYYDDMM (sans l'heure), et qui est importé avec succès dans un tableau avec la DATE de type de données SQL. C'est bien ce qui inclut le temps que je vais avoir de la difficulté avec.
- Êtes-vous sûr que le YYYYDDMM sans le temps est effectivement importées correctement? Ceux-ci sont probablement l'échange le D et valeurs de M...
- C'est l'échange le D et valeurs de M pour la YYYYDDMM format, mais ce n'est pas un problème. Je n'ai pas besoin de la date dans un format particulier, j'ai juste besoin de cela comme un SQL de type Date (ou une variante) afin que je puisse effectuer des calculs dans des Procédures Stockées.
- Si vous n'avez pas de soins si les données sont exactes ou pas? Si l'utilisateur a entré le 1er Mars, mais vous l'interpréter comme le 3 janvier, et c'est ok? Je suis très confus.
- oh... je vois ce que tu veux dire. Les importations de données avec succès à la DATE de l'objet, et quand je regarde les champs dans la base de données qu'il semble être dans le même format que c'était l'entrée dans l' (YYYYDDMM). Aussi, le SQL docs (technet.microsoft.com/en-us/library/bb630352.aspx) semblent indiquer que la valeur par défaut est le format AAAA-JJ-MM, donc, j'ai au moins j'espère que c'est importé correctement. Je vais vérifier pour s'assurer que, merci pour élever le souci!
- Où voyez-vous AAAA-JJ-MM sur cette page?
- emm... mes yeux ont m'a trompé, en fait oui de la chaîne par défaut est ce que vous avez dit, AAAA-MM-JJ
- Je suggère de dire à celui qui fournit ces données pour vous d'arrêter d'être stupide à ce sujet et de fournir un format valide. Ou de pré-traiter les fichiers avec un très simple programme de ligne de commande avant d'ajouter SQL Server complexité.
- Si vous lisez mes commentaires ci-dessous, dans la réponse, vous allez le voir j'ai fait une fausse supposition sur le format. Malheureusement, les données fournies sont venus sans plus de détails de format... la bêtise tout autour! Merci pour l'aide et des conseils.
Vous devez vous connecter pour publier un commentaire.
Si elle est, en fait, AAAAMMJJ, alors il est un peu plus simple:
SELECT ... FROM dbo.table WHERE ISDATE(LEFT([date],4) + SUBSTRING([date],7,2) + SUBSTRING([date],5,2) + ' ' + STUFF(RIGHT([date],4),3,0,':')) = 0;