2011-04-20 5 views
1

J'ai un problème de conversion date dans SQL Server 2008SQL Server - date de conversion

La valeur que je suis en train de convertir ressemble à ceci: 30-NOV-44 08.00.00.000000000

Le résultat je me regarde en arrière comme ceci: 2044-11-30 00:00:00.000

le code que je utilise est la suivante:

SELECT TOP 1000 [USER_ID] 
     ,CONVERT(datetime,SUBSTRING([DATEOFBIRTH],0,11),112) AS ConvertedDate 
     ,[DATEOFBIRTH] 
    FROM [IAM_Perf].[dbo].[01_Data] 
    WHERE DATEOFBIRTH IS NOT NULL 

Quel que soit le paramètre que j'utilise la fonction CONVERT je reçois le même format de retour et beaucoup de dates sont en cours de conversion dans le futur ??!

Les résultats changent lorsque je bascule entre date et date-heure dans le premier argument de la CONVERT mais cela n'a aucun impact sur les résultats incorrects.

J'utilise la fonction de sous-chaîne, car sinon il ne convertit pas la valeur et génère cette erreur:

Msg 241, Level 16, State 1, Line 1 Conversion failed when converting date and/or time from character string.

Je ne suis pas sûr de savoir comment lutter contre cela, je ne peux pas guaruntee le format restera toujours le même Sinon, je voudrais juste le reformater manuellement en utilisant du T-SQL

Quelqu'un at-il des idées?

Merci,

Matt

Répondre

3

Depuis les dates futures sont parfaitement valables dans SQL Server, le système doit utiliser une heuristique lorsque vous passez seulement elle une date à 2 chiffres. Je crois que l'heuristique par défaut est que les années 0-49 sont au 21ème siècle, et les années 50-99 sont au 20ème siècle. Ceci est cependant configurable.

Vous devez corriger ces données avant qu'elles ne se retrouvent dans votre base de données, et préférez de toute façon stocker DateOfBirth dans une colonne datetime de toute façon (plutôt que sous forme de chaîne).


Une valeur datetime n'a pas un format - mais si vous avez converti quelque chose dans un datetime, et puis essayez de l'afficher, il sera toujours reconverti en une chaîne dans le même format (à moins que vous le convertissez explicitement en utilisant CONVERT).

+1

En plus, vous devez sous-indiquer votre date car l'heure n'est pas dans un format valide avec toutes les périodes. Si vous regardez la documentation de la fonction CONVERT vous verrez que SQL ne convertira jamais une date ** en ** une fois avec seulement des points. En bref, SQL ne convertira une chaîne en datetime que s'ils sont formatés de la même manière que dans la documentation CONVERT. – Jim

+0

Exactement ce que je cherchais, une réponse éducative. – Yoda

3

Vous pouvez configurer l'année de coupure à l'aide

EXEC sp_configure 'show advanced options', 1 
RECONFIGURE 
EXEC sp_configure 'two digit year cutoff', 2011 
RECONFIGURE 

Notez que ce paramètre est un serveur à l'échelle et peut casser les requêtes sur les bases de données d'autres.

0

2010/10/10_

Convertir et puis utilisez subtring select *, substring ((convertir (varchar (12), hire_date, 121)), 1,10) de l'employé

ou

cela peut porter l'espace à côté de la date SUBSTRING ([dateOfBirth], 0.11), 112)

ou Essayez ce même avec 10 chiffres, la conversion peut se produire bien SUBSTRI NG ([DATEOFBIRTH], 0,10), 112)