将varchar dd-mm-yyyy转换为SQL Server 2008中的yyyy-mm-dd日期字段

时间:2017-10-12 15:35:35

标签: sql-server sql-server-2008 date

希望这个标题描述了我想要做的事情。

我在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来尝试查找可能阻止转换的任何字符,但我还没能找到任何东西。

任何帮助将不胜感激。谢谢!

5 个答案:

答案 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失败的问题,但我不确定选择答案的最佳方法(名副其实的堆栈菜单),所以,任何帮助都会受到赞赏。以下是我找到问题的主要步骤:

  1. 我使用MIN和MAX SUBSTRING来识别组件的组成部分 varchar字段是正确的(即,前两位数min = 01 max = 31, 中间两分钟= 01最大= 12)
  2. 我使用DISTINCT SUBSTRING来识别所有日期分隔符是否一致(即所有破折号)。
  3. 我使用MAX(LEN)确定我的varchar“date”字段是12个字符(相对于我期望的10个字符)。
  4. 我使用CONVERT(VARBINARY,MYDATEFIELD2)来确定字符串中实际存储的内容。
  5. 最后一步显示该字段包含换行符(00A)。我在记事本++中打开了源文本文件,单击了View - >显示符号 - >显示所有字符,我可以在每行的末尾看到LF。

    所以现在我正在修改DTSX包(固定宽度文本)以包含我之后可以删除的换行的额外字段。现在我知道日期字段的预期格式是什么,我将尝试将它们导入为DT_DATE与DT_STR。我不确定如何在导入时指定正确的日期样式105(感谢@Panagiotis Kanavos),但我会弄明白的。

    呼!多大的学习经历! :d

    感谢所有帮助过的人 - 如果您能就选择最佳答案的最佳方式提出建议,我们将不胜感激。

答案 4 :(得分:-1)

如果您尝试转换,请尝试以下SQL:

SELECT CONVERT(DATE,REPLACE(DateField,'-','/'),103) from TableName

请注意,此SQL无法找到导致错误的条目。