希望这个标题描述了我想要做的事情。
我在SQL Server 2008表中有一个varchar字段,其中包含格式为dd-mm-yyyy的文本日期(例如,31-12-2009)。我试图使用CONVERT将其转换为DATE字段。我使用以下方法成功地在同一个表中转换了类似的varchar字段:
SELECT DISTINCT(CONVERT(DATE, MYDATEFIELD1, 103)) AS [CONV_MYDATEFIELD1] FROM MYTABLE;
但是当我将它应用于MYDATEFIELD2时,它似乎与MYDATEFIELD1具有相同类型的数据值,它失败并出现以下错误:
Msg 241,Level 16,State 1,Line 1 从字符串转换日期和/或时间时转换失败。
我尝试过排序并使用LIKE来尝试查找可能阻止转换的任何字符,但我还没能找到任何东西。
任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
您可能有一些无效日期(例如30-02-2009),尝试找到它们分割字符并验证日期和月份,确保日期对应于月份,月份在01范围内 - 12。
答案 1 :(得分:0)
如果找不到导致转换错误的值,则使用游标单独检查所有记录并使用TRY CATCH查找导致转换错误的记录。您可以在CATCH块中使用PRINT语句来标识错误的记录。
答案 2 :(得分:0)
使用以下内容查找错误日期:
SET DATEFORMAT dmy;
select MYDATEFIELD1, isdate(MYDATEFIELD1)
from MYDATEFIELD1
答案 3 :(得分:0)
我发现导致CONVERT失败的问题,但我不确定选择答案的最佳方法(名副其实的堆栈菜单),所以,任何帮助都会受到赞赏。以下是我找到问题的主要步骤:
最后一步显示该字段包含换行符(00A)。我在记事本++中打开了源文本文件,单击了View - >显示符号 - >显示所有字符,我可以在每行的末尾看到LF。
所以现在我正在修改DTSX包(固定宽度文本)以包含我之后可以删除的换行的额外字段。现在我知道日期字段的预期格式是什么,我将尝试将它们导入为DT_DATE与DT_STR。我不确定如何在导入时指定正确的日期样式105(感谢@Panagiotis Kanavos),但我会弄明白的。
呼!多大的学习经历! :d
感谢所有帮助过的人 - 如果您能就选择最佳答案的最佳方式提出建议,我们将不胜感激。
答案 4 :(得分:-1)
如果您尝试转换,请尝试以下SQL:
SELECT CONVERT(DATE,REPLACE(DateField,'-','/'),103) from TableName
请注意,此SQL无法找到导致错误的条目。