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:
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:
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.