转换日期时转换失败

时间:2016-01-20 00:47:44

标签: sql tsql

我将日期存储为varchar(50) 1/7/1958'我希望将其转换为日期。

我试过这个;

select convert(date,(left(date_of_birth,10))并收到以下错误消息。

  

从字符串转换日期和/或时间时转换失败。

当我删除列名并硬编码日期

select convert(date,(left('1/7/1958',10)))我得到此1958-01-07我想转换并插入日期字段。

这是我正在使用的代码。

SELECT LTRIM(RTRIM(CONVERT(DATE, (LEFT(date_of_birth, 10)))))
FROM employee_temp WHERE date_of_birth NOT IN ('0000160-1'
                                      , '0000354-1'
                                      , '0000423-1'
                                      , '0000478-1'
                                      , '0000509-1'
                                      , '0000616-1'
                                      , '0001017-1'
                                      , '0001183-1'
                                      , '0001208-1'
                                      , '0001298-1'
                                      , '0001358-1'
                                      , '0001427-1'
                                      , '0001500-1'
                                      , '0001823-1'
                                      , '0001919-1'
                                      , '0001941-1'
                                      , '0001968-1'
                                      , '0001999-1'
                                      , '0002029-1'
                                      , '07/28/0966'
                                      , ' '
                                      , '8')

任何建议都会很棒。

3 个答案:

答案 0 :(得分:0)

首先,LTRIM()RTRIM()在某个日期没有意义。这些是字符串函数,而不是日期函数。

其次,简单的方法是使用try_convert()

SELECT TRY_CONVERT(DATE, LEFT(date_of_birth, 10), 10)

第三,您可能需要确定SQL Server早期版本中的日期格式是否正确。为此,请使用case

SELECT (CASE WHEN date_of_birth LIKE '[01][0-9]-[0-3][0-9]-[0-9][0-9]%'
             THEN CONVERT(DATE, LEFT(date_of_birth, 10))
        END)

我注意到你正在使用格式" 10"但对于一个10个字符的字符串。格式" 10"正式是MM-DD-YY。对于MM-DD-YYYY使用" 110"。即使" 10"有效,这是误导。

答案 1 :(得分:0)

修复您的数据库,以便将日期存储为日期。你正在做的事情是错的。

答案 2 :(得分:0)

我会使用ISDATE()功能:

SELECT CONVERT(DATE, date_of_birth)
FROM employee_temp
WHERE ISDATE(date_of_birth) = 1;