将nvarchar转换为date列

时间:2013-02-07 16:30:56

标签: sql sql-server

我有一个表格,其中有一列日期为m / d / yyyy格式,存储在 nvarchar(50)数据类型中(我继承了这个...)。我想将这些列转换为 date 数据类型,以便正确存储它们,但不能不小心丢弃列中的数据。

我已尝试在SQL Server 2008R2中执行此操作,使用设计器将数据类型更改为日期。这适用于我的测试列(保留日期,更正格式等),但所有空值变为1900-01-01。我可以忍受这一点,但似乎有一个更有说服力的解决方案。

然而,当我在真实数据列上尝试它时,我收到一个错误:

  

无法修改表格。从字符串转换日期和/或时间时转换失败。

处理此问题的正确方法是什么?对不起,如果这是重复的。我一直在寻找一个小时,但没想出来。

5 个答案:

答案 0 :(得分:3)

您显然在表中某处SQL Server无法转换为日期的数据。您可以在以下行中找到带有查询的行:

SELECT * FROM TableName WHERE ISDATE(ColumnName) != 1

显然,您需要将TableName和ColumnName替换为实际名称。

一旦您确定了包含错误数据的行,处理它取决于您...为每行手动更改数据,将它们设置为null,无论您认为在这种情况下是否可接受。

答案 1 :(得分:0)

我建议您添加一个带有Date数据类型的新列,然后转换/复制数据,最后删除原始列。

答案 2 :(得分:0)

你可以做的是

  1. 将另一列添加到DATETIME

  2. 类型的表中
  3. 通过将现有列值转换为DATETIME

  4. 来更新新列值
  5. 删除现有列

答案 3 :(得分:0)

也许你可以暂时复制具有日期数据类型的列,这样你可以运行更新命令将varchar转换为datetime并将其存储在这个新列中,当你确定所有信息都是正确的时,你可以删除列并将新列重命名为原始名称。

当我需要确保不丢失有关更改数据类型的信息时,我总是这样做。

答案 4 :(得分:0)

您可以使用以下查询将您的日期更新为ISO Format (yyyymmdd),以保证在任何服务器上工作。 SQL SERVER - DEMO涵盖了您的约会的4种可能情况,例如'd/m/yyyy''dd/m/yyyy''d/mm/yyyy'& 'dd/mm/yyyy'并将其更新为ISO Format

Update mytable
Set d = right(d,charindex('/',reverse(d),1)-1) + 
            right('0' + substring(d, charindex('/',d,1) + 1, charindex('/', d, charindex('/',d,1) + 1 ) - charindex('/',d,1) -1 ),2) +
            right('0' + left(d,charindex('/',d,1)-1),2)

您可以在选择查询中直接使用此方法

Select id,convert(date,
            right(d,charindex('/',reverse(d),1)-1) + 
            right('0' + substring(d, charindex('/',d,1) + 1, charindex('/', d,
                        charindex('/',d,1) + 1 ) - charindex('/',d,1) -1 ),2) +
            right('0' + left(d,charindex('/',d,1)-1),2)
            ) correctDate
From mytable