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

问题描述:

希望标题能够描述我正在尝试执行的操作。将varchar dd-mm-yyyy转换为SQL Server 2008中的yyyy-mm-dd日期字段

我在SQL Server 2008表中包含格式为dd-mm-yyyy(例如31-12-2009)的文本日期的varchar字段。我正在尝试使用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

没有'yyyy-mm-dd日期字段'这样的东西。日期类型没有格式。只有当你想从数据创建一个字符串来显示或者将一个字符串解析成日期时,格式才会起作用。 –

+0

发布* actual *表模式和* data *。错误表示第二个字段中的字符串没有与第一个字段相同的格式 –

+0

[如何将“dd/mm/yyyy”字符串转换为SQL Server中的datetime?](https:// * .com/questions/2780668/how-to-convert-a-dd-mm-yyyy-string-to-datetime -in-sql-server) –

你可能会有一些无效的日期(例如30-02-2009),试图找到他们拆分字符和验证日期和月份,确保日期对应于月份和月份在范围01 - 12

+0

或者,安装SQL Server 2017 Express版本,复制数据并使用'TRYPARSE'来查找哪些行有问题 –

+0

我使用了substring来标识最小值最大值,它看起来像MyDateField1的预期样式是DD-MM-YYYY – user183121

+0

而MyDateField2也是这样 - 前两个数字是01-31,后面两个数字是01-31。 MyDateField1有一些空白值的行。我猜看年是最后一步。 – user183121

如果你想转换,那么试试下面的SQL:

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

请注意,这个SQL没有找到该项目导致的错误。

+0

为什么你认为一个*随机*替换会帮助?如果数据使用'-'作为分隔符,则使用* correct * date样式 –

+0

@PanagiotisKanavos,一旦我运行上面的语句,结果将是“2009-12-31”而不是“2009/12/31”。如果我在某处错了,请纠正我。 – Madhukar

+1

是的,你错了。首先,OP说第一个查询**工作**。其次,无论样式代码如何,CONVERT都可以使用'-'和'/'。尝试一下。 –

如果您无法找到哪个值导致转换错误,请使用光标逐个查看所有记录,然后使用TRY CATCH查找哪些记录会导致转换错误。您可以在CATCH块中使用PRINT语句来标识出错的记录。

具有以下查找你的坏日子:

SET DATEFORMAT dmy; 

select MYDATEFIELD1, isdate(MYDATEFIELD1) 
from MYDATEFIELD1 

我想通了,这是造成转换失败的问题,但我不知道的,选择一个答案(名副其实的堆栈小白)的最佳方法所以,任何帮助,将不胜感激。下面是我找到了问题的主要步骤:

  1. 我用MIN和MAX SUBSTRING,以确定该 varchar字段的组成部分是正确的(即第一个两位数字分钟= 01最大值= 31 , middle two min = 01 max = 12)
  2. 我使用了DISTINCT SUBSTRING来识别所有日期分隔符是否一致(即所有破折号)。
  3. 我使用MAX(LEN)来确定我的varchar“date”字段是12个字符(与我期待的10个字符对比)。
  4. 我使用CONVERT(VARBINARY,MYDATEFIELD2)来确定实际存储在字符串中的内容。

最后一步显示该字段包含换行符(00A)。我用notepad ++打开源文本文件,单击视图 - >显示符号 - >显示所有字符,我可以在每行的末尾看到LF。

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

Whe!什么是学习体验! :D

感谢大家谁帮助 - 如果你可以给出最好的方式来选择最佳答案的建议,将不胜感激。