2009-05-18 6 views
0

J'ai besoin d'un script SQL pour valider un champ VARCHAR dans une table d'une base de données SQL Server 2005 contenant des valeurs DateTime au format DD/MM/YYYY ou NULL. Je voudrais identifier toutes les dates non valides. Quelqu'un peut-il suggérer une méthode?Valider la chaîne DateTime dans SQL Server 2005

MISE À JOUR

  • La réponse doit utiliser T-SQL; Pour des raisons de performances, je ne peux pas utiliser SQLCLR.

Merci, MagicAndi

Répondre

8

utilisation "ISDATE()" ou "IS NULL": mais définir la langue première à reconnaître l'ordre jour-mois-année

SET LANGUAGE british 
SELECT ISDATE('12/31/2009'), ISDATE('31/12/2009') 

SET LANGUAGE us_english 
SELECT ISDATE('12/31/2009'), ISDATE('31/12/2009') 

Edit: Comme mentionné par @edosoft, vous pouvez utiliser SET DATEFORMAT aussi. SET LANGUAGE définit implicitement DATEFORMAT, SET DATEFORMAT remplace SET LANGUAGE

+1

Je ne connaissais pas le bit SET LANGUAGE +1 –

+0

+1 Moi ni :-) –

3

Vous pouvez utiliser la fonction ISDATE()

2

vous pouvez utiliser la fonction intégrée IsDate T-SQL(). et remplacez la colonne par datetime pas varchar. vous ne pouvez pas trier ou effectuer des calculs de date sur une colonne varchar.

0

La gestion des dates de SQL n'est pas géniale, nous avons écrit une fonction DotNet pour effectuer nos conversions DateTime pour les cas difficiles.

5

Vous devez spécifier le format de date lors de l'utilisation de ISDATE(). De la documentation en ligne:

SET LANGUAGE us_english; 
SET DATEFORMAT dmy; 
SELECT ISDATE('15/04/2008'); --Returns 1. 
+0

Une autre excellente réponse. SET DATEFORMAT dmy, au lieu de SET LANGUAGE britannique +1 –

+0

Doh!J'ai oublié celui-là. – gbn

0

J'ai une solution, bien qu'elle s'applique uniquement dans un certain ensemble de circonstances. Votre cas peut ou peut ne pas être bon pour cela.

Créez une table appelée ALMANAC avec une ligne pour chaque date valide. Vous pouvez le remplir avec dix ans de dates valides avec seulement 3 653 lignes, plus ou moins. Même si vous y allez pendant une centaine d'années, ce n'est toujours que 36 525 lignes, pas trop grandes par rapport aux normes actuelles.

Vous pouvez ajouter d'étranges attributs spécifiques à cette table si c'est utile. Ce sont des attributs comme si la date est un jour férié spécifique à l'entreprise ou non, et à quelle semaine fiscale, mois fiscal, trimestre fiscal et année fiscale appartient la date.

Vous devrez écrire un programme pour remplir cette table, et ce programme devra intégrer vos règles de calendrier spécifiques à votre entreprise, si vous choisissez les attributs supplémentaires. Ensuite, vous pouvez utiliser cette table comme si vous utilisiez n'importe quelle table de validation de code. Vous pouvez également être en mesure de l'utiliser pour rendre les critères de rapport basés sur un calendrier excentrique absolument triviaux à mettre en œuvre.

Ceci est seulement une bonne idée si vos dates sont limitées à une période de temps limitée, comme dix ans ou peut-être même cent ans. Mais parfois, il peut vraiment être un gain de temps! J'ai parfois utilisé cette technique pour rendre ma base de données indépendante des fonctions de calendrier d'un fournisseur.

Questions connexes