2017-08-24 58 views
2

在SQL Server 2005中,我有一个timestamp类型的列。我想转换为datetime类型。例如:SQL Len(替换)

'20170824112344' 

但他们可能会变坏。例如:

'____123456____' 

_ = blank spaces 

我想那些长度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 

过滤,但它不工作

回答

4

你可以只检查字符串完全由14位:

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]' 

请注意,我删除了CASE表达式,因为您可以从同一个表达式中返回一个字符串和一个日期时间。

Demo

+1

有人可能会说'LTRIM'和'RTRIM'并不像'LIKE'确保字符串长度为14个字符,并且仅由数字确有必要。 – Alex

+0

但我需要所有的记录。 如果你可以转换成日期,但你有什么 –

+0

如果我的答案不适合你,那么更新你的问题,显示明确的输入和预期的输出。 –