CONVERT()仅在SELECT查询中的其他列有效时

时间:2019-01-15 13:01:17

标签: sql sql-server

和我一起玩这个,我不太会解释!

我正在尝试做一个简单的UPDATE,将数据从dd / MM / yyyy转换为yyyy-MM-dd。但是我得到了错误:

  

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

通常,这是一个非常容易调试的错误...

但是,在调试时,我决定从表中检索所有列以及最后的转换列...哪个工作正常?转换为列,返回所有行,没有问题:

SELECT 
    x.*, 
    CONVERT(date, x.[date], 103) test 
FROM 
    table_name x 
WHERE 
    import_date = (SELECT MAX(import_date) FROM table_name) 
ORDER BY 
    part_num DESC

但这是我更加困惑的地方。如果我删除了x.*引用并仅返回转换后的列,它将返回上面的错误消息。

我几乎可以肯定我很傻,而且我犯错的地方非常简单,但是有人可以帮忙吗?!

编辑: 如第一句话所建议,我按如下方式使用TRY_CONVERT()。所有返回的“投放成功”:

SELECT CASE WHEN TRY_CONVERT(date, date,103) IS NULL   
THEN 'Cast failed'  
ELSE 'Cast succeeded'  END FROM table_name WHERE import_date = (SELECT MAX(import_date) FROM table_name)

1 个答案:

答案 0 :(得分:2)

大概是您的日期值错误。这可能会在被过滤掉的行中发生,这就是为什么有时会收到错误或不收到错误的原因-取决于执行过滤的方式。

只需使用以下方法找到错误的值

SELECT date
FROM test
WHERE TRY_CONVERT(date, x.[date], 103) IS NULL AND x.[date] IS NOT NULL;