2017-08-24 3 views
2

Dans SQL Server 2005, j'ai une colonne de type timestamp. Je veux convertir au type datetime. Par exemple:SQL Len (remplacer)

'20170824112344' 

Mais ils peuvent venir mauvais. Par exemple:

'____123456____' 

_ = blank spaces 

Je veux filtrer par ceux ayant une longueur 14.

case 
    when len(replace(fecha,' ','')) = 14 
     then convert(smalldatetime, SUBSTRING(fecha, 7, 2) + '-' + 
            SUBSTRING(fecha, 5, 2) + '-' + 
            SUBSTRING(fecha, 1,4) + ' ' + 
            SUBSTRING(fecha, 9, 2) + ':' + 
            SUBSTRING(fecha, 11, 2) + ':00', 103) 
     else fecha 
end as fecha 

mais il ne fonctionne pas

Répondre

4

Vous pouvez vérifier que simplement la chaîne est entièrement constitué de 14 chiffres:

SELECT 
    CONVERT(smalldatetime, SUBSTRING(fecha, 1, 4) + '-' + SUBSTRING(fecha, 5, 2) 
     + '-' + SUBSTRING(fecha, 7, 2) + ' ' + SUBSTRING(fecha, 9, 2) + ':' + 
     SUBSTRING(fecha, 11, 2) + ':00', 120) AS fecha 
FROM yourTable 
WHERE fecha 
    LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' 

Notez que j'ai supprimé l'expression CASE car vous pouvez Ne retourne pas à la fois une chaîne et un datetime à partir de la même expression.

Demo

+1

On peut soutenir que '' LTRIM' et RTRIM' ne sont pas vraiment nécessaire que 'LIKE' assure que la chaîne est de 14 caractères et est composé uniquement de chiffres. – Alex

+0

Mais j'ai besoin de tous les records. Si vous pouvez convertir à ce jour, mais ce que vous avez –

+0

Si ma réponse ne fonctionne pas pour vous, alors mettez à jour votre question en affichant une entrée claire et la sortie attendue. –