web-dev-qa-db-fra.com

Conversion de AAAAMMJJ en DATE

J'ai un tas de dates dans varchar comme ceci:

20080107
20090101
20100405
...

Comment puis-je les convertir en un format de date comme celui-ci:

2008-01-07
2009-01-01
2010-04-05

J'ai essayé d'utiliser ceci:

SELECT [FIRST_NAME]
      ,[MIDDLE_NAME]
      ,[LAST_NAME]      
      ,cast([GRADUATION_DATE] as date)      
  FROM mydb

Mais recevez ce message:

Msg 241, Niveau 16, Etat 1, Ligne 2
La conversion a échoué lors de la conversion de la date et/ou de l'heure d'une chaîne de caractères.

9
screechOwl

L'erreur se produit parce que vous (ou quiconque a conçu cette table) have a bunch of dates in VARCHAR. Pourquoi vous (ou qui que ce soit qui a conçu cette table) stockez les dates sous forme de chaînes? Est-ce que vous (ou celui qui a conçu cette table) enregistrez également les salaires, les prix et les distances sous forme de chaînes?

Pour rechercher les valeurs à l'origine du problème (afin que vous (ou le créateur de ce tableau) puissiez les résoudre):

SELECT GRADUATION_DATE FROM mydb
  WHERE ISDATE(GRADUATION_DATE) = 0;

Je parie que vous avez au moins une rangée. Fixez ces valeurs, puis FIX THE TABLE. Ou demandez à celui qui a conçu la table pour FIXER LA TABLE. Vraiment bien.

ALTER TABLE mydb ALTER COLUMN GRADUATION_DATE DATE;

Maintenant, vous n'avez plus à vous soucier de la mise en forme: vous pouvez toujours formater YYYYMMDD ou YYYY-MM-DD sur le client, ou utiliser CONVERT en SQL. Lorsque vous avez un valide date en tant que littéral de chaîne, vous pouvez utiliser:

SELECT CONVERT(CHAR(10), '20120101', 120);

... mais c'est mieux fait sur le client (voire pas du tout).

Il existe un terme populaire - garbage in, garbage out. Vous ne pourrez jamais convertir une date (peu importe la conversion en chaîne dans un format spécifique) si votre choix de type de données (ou le choix du type de données de la personne qui a conçu la table) autorise intrinsèquement des erreurs ta table. Regle-le, s'il te plait. Ou demandez à celui qui a conçu la table (encore une fois, très gentiment) de la réparer.

19
Aaron Bertrand

Utilisez SELECT CONVERT(date, '20140327')

Dans ton cas,

SELECT [FIRST_NAME],
       [MIDDLE_NAME],
       [LAST_NAME],
       CONVERT(date, [GRADUATION_DATE])     
FROM mydb
8
user1400641

Dans votre cas, cela devrait être:

Select convert(datetime,convert(varchar(10),GRADUATION_DATE,120)) as
'GRADUATION_DATE' from mydb
0
user3590035