J'ai une table principale appelée Cases
dans laquelle j'insère des données. J'ai une table alternative où toutes les données brutes appelées rawTableData
sont stockées et ensuite envoyées à la table principale.Conversion de nvarchar en datetime à partir d'une grande table d'enregistrements avec des chaînes de date potentiellement mauvaises
J'ai une colonne nvarchar
dans mon rawTableData
qui stocke une chaîne datetime dans ce format
2016-04-04-10.50.02.351232
J'ai une colonne dans ma table Cases
qui a un type de DATETIME
.
J'ai d'abord essayé de trouver les mauvaises données dans cette méthode ci-dessous
SELECT CONVERT(datetime, nvarcharDateColumn, 103)
FROM rawTableData
WHERE ISDATE(CONVERT(datetime, nvarcharDateColumn, 103)) != 1
Et je reçois l'erreur ci-dessous
La conversion du type de données nvarchar à un type de données DATETIME a donné une sortie valeur de la plage.
Alors j'ai essayé une approche différente dans l'espoir de trouver tous les hors de portée des valeurs
SELECT nvarcharDateColumn
FROM rawTableData
WHERE ISDATE(nvarcharDateColumn)
Mais qui retourne que toutes les lignes depuis sa nvarchar.
Encore une fois, je continuais à aller et essayé une approche différente
SELECT CONVERT(DATETIME, CASE WHEN ISDATE(nvarcharDateColumn) = 1 THEN nvarcharDateColumn END, 103)
FROM rawTableData
Je ne sais pas ce que je fais mal ici et toute aide serait appréciée.
J'utilise SQL Server 2012
'IsDate() 'est notoirement inexacte, et stocker des dates sous forme de chaînes n'aide pas vraiment. Comme il est dit que cela entraîne une valeur hors de portée, avez-vous des dates qui sont plus anciennes que 1753-01-01? – Siyual
@Siyual pas la gamme est entre 2013-2017, je pense que certaines des dates pourraient être US et UK – imBlue
Cela pourrait être le problème alors - si vous stockez des dates avec les deux formats dans le même domaine, il n'y a aucun moyen de comprendre qui est ce qui est (la norme ISO est «aaaa-MM-jj») – Siyual