2017-07-20 4 views
1

Je suis en train de convertir nvarchar(5) année de naissance (par exemple 1972) en datetime (par exemple 1972-06-01) dans une table SQL Server.SQL Server: convertir nvarchar année à datetime

Quelque chose comme:

UPDATE TableName 
SET DateOfBirth = CONVERT(datetime, YearOfBirth + '/01/01', 103) 

Cela jette une erreur

Échec de la conversion date et/ou le temps de chaîne de caractères

Comment puis-je résoudre ce problème?

+1

Marquez les dbms que vous utilisez. Quelques SQL non-ANSI là ... – jarlh

+1

Pourquoi devient-il 1972-0 ** 6 ** - 01? –

+0

Le meilleur format si vous avez vraiment besoin d'exprimer des dates comme * littéraux de chaîne * est le format ** ISO-8601 ** adapté dans SQL Server: «YYYYMMDD» (pas de tirets, pas d'espaces - rien). Cela fonctionne pour ** tous ** paramètres régionaux/langue - alors essayez ceci: 'CONVERT (datetime, YearOfBirth + '0101', 103)' et je suis assez sûr que ça va fonctionner très bien –

Répondre

0

Ceci est tout ce que vous devez

UPDATE TableName 
SET DateOfBirth = YearOfBirth + '-06-01' 
Where YearOfBirth = '1972' 
4

Ce que vous faites a besoin de deux étapes: stocker la valeur dans la colonne comme une date, puis changer le type.

Dans votre cas, une troisième étape est nécessaire. La colonne est donc suffisamment grande pour stocker la représentation sous forme de chaîne de valeur de la valeur de date. Je pense que cela va fonctionner dans SQL Server:

ALTER TABLE TableName ALTER COLUMN DateOfBirth NVARCHAR(32); 

UPDATE TableName 
    SET DateOfBirth = YearOfBirth + '-01-01'; 

ALTER TABLE TableName ALTER COLUMN DateOfBirth Date; 

La première ALTER TABLE modifie la colonne pour être suffisamment large pour le nouveau mois et le jour. Ensuite, la date est construite dans un format standard (d'accord, en laissant de côté les traits d'union serait encore plus standard). Ensuite, la colonne est transformée en une date.

Si vous voulez juste quelque chose qui ressemble à une date - et beaucoup de critique sur Stack Overflow;) - vous pouvez éliminer la troisième étape.