Différents formats de date dans une seule colonne dans le server SQL

J'utilise le server SQL. Nous avons une colonne date dans le tableau mais certaines d'entre elles sont stockées dans un format différent.

Par exemple: Nous avons des loggings avec le format 2015-12-09 00:00:12.000 mais certains loggings sont là avec le format comme 2015/09/09 00:08:09.000 ou tout autre type de date valide. Comment puis-je identifier les loggings avec un format de date différent de la table. J'ai essayé d'utiliser la fonction isdate() mais comme toutes les dates sont valides, il n'y a pas de chance. Pouvez-vous me guider s'il vous plaît avec ceci.

Solution partie 1

Bien qu'il soit possible que cette solution ne résolve pas complètement votre problème, si au less vous pouvez unifier vos dates pour qu'elles se ressemblent, votre position devrait être grandement améliorée en plaçant les éléments suivants en haut de votre requête:

 SET DATEFORMAT DMY 

OU

 SET DATEFORMAT YMD 

OU

 SET DATEFORMAT MDY 

Exemple

 SELECT [date] FROM [your_table] 

Points de note:

  • M signifie mois, D signifie jour et Y signifie année.

  • La définition de DATEFORMAT affecte à la fois la façon dont les dates apparaissent dans le jeu de résultats et comment les dates sont converties en VARCHAR et similaires.

  • Si vous ne définissez pas DATEFORMAT, l'exécution de la même procédure stockée sur des machines / installations différentes peut donner des résultats différents.

Solution partie 2

Vous pouvez également effectuer une manipulation de string pour replace , / , etc. avec le caractère de votre choix.

..Mettez les éléments suivants en haut de votre requête:

 DECLARE @DateSeparator NVARCHAR(1) = '/' 

..Utilisez les éléments suivants dans le cadre de votre instruction select:

 REPLACE(REPLACE([date], '/', @DateSeparator), '-', @DateSeparator) 

Exemple

 SELECT REPLACE(REPLACE(CONVERT(NVARCHAR(20), [date]), '/', @DateSeparator), '-', @DateSeparator) AS [date] FROM [your_table] 

Points de note:

  • Dans l'exemple ci-dessus, le séparateur de date est défini sur / , mais remplacez la valeur de @DateSeparator par le séparateur de date de votre choix.

Les deux solutions combinées

Exemple

 SET DATEFORMAT YMD SELECT REPLACE(REPLACE(CONVERT(NVARCHAR(20), [date]), '/', @DateSeparator), '-', @DateSeparator) AS [date] FROM [your_table] 

Points de note:

  • Remplacez [your_table] par le nom de votre table source.

Puisque les dates ont été stockées en tant que VARCHAR au lieu de DATETIME (comme elles auraient dû l'être) alors il n'y a vraiment aucun moyen par le biais de SQL pour le déterminer. La date '2016-02-01' est-elle le 1er février ou le 2 janvier? Si vous ne pouvez pas dire alors comment un code informatique va-t-il le comprendre?

Votre meilleur pari est de revenir à travers l'application (s) qui ont inséré ou mis à jour datatables dans le tableau et essayer de comprendre ce qu'ils ont pu utiliser. Si les users ne faisaient que saisir des données, cela n'aidera probablement pas, bien que vous puissiez peut-être searchr des consistances – Janice entre toujours datatables MM / JJ / AAAA, mais Pierre les place toujours sous JJ / MM / AAAA, etc. Le meilleur pari pour le rétrécir. Sinon, vous pourriez regarder d'autres données dans votre système – si la table a aussi une colonne inserted_on par exemple, alors peut-être que cela et votre autre date seront généralement à quelques jours l'un de l'autre, etc.