2017-07-14 4 views
0

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

+1

'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

+0

@Siyual pas la gamme est entre 2013-2017, je pense que certaines des dates pourraient être US et UK – imBlue

+0

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

Répondre

0

Vous pouvez utiliser TRY_CONVERT:

SELECT nvarchardatecolumn, TRY_CONVERT(date, nvarchardatecolumn) 
FROM rawTableData 

Et si vous ne souhaitez que retourner les dates non valides, utilisez une table dérivée:

SELECT * 
FROM (SELECT nvarchardatecolumn, TRY_CONVERT(date, nvarchardatecolumn) DateCheck 
     FROM rawTableData 
    ) A 
WHERE DateCheck IS NULL 
+0

Le problème est qu'il retournera tous comme null parce qu'ils sont nvarchar mais je ne peux pas sembler le convertir en un datetime – imBlue

+0

Nvarchar peut convertir à date juste très bien ... S'il renvoie 'NULL' pour tous, cela signifie que aucun d'eux n'est dans un format de date correct. –

+0

vous pourriez être sur quelque chose, je viens de vérifier les colonnes qui ont des valeurs datetime de travail et par rapport à celui que j'ai dans la colonne nvarchardatecolumn il y a une ligne où il ne devrait pas être, ressemble à c'est le problème. 2016-04-04 (--->) - (<---) 10.50.02351232 – imBlue