Sql 将nvarchar转换为日期列

Sql 将nvarchar转换为日期列,sql,sql-server,Sql,Sql Server,我有一个表,其中有一列以nvarchar(50)数据类型存储的m/d/yyyy格式的日期(我继承了这个…)。我想将这些列转换为日期数据类型,以便正确存储它们,但不能意外地将数据放入列中 我在SQLServer2008R2中尝试过这样做,使用设计器将数据类型更改为最新。这对我的测试栏有效(保留日期、更正格式等),但所有空值都变成1900-01-01。我可以接受,但似乎有一个更雄辩的解决方案 但是,当我在real data列上尝试时,收到一个错误: 无法修改表。从字符串转换日期和/或时间时,转换失败

我有一个表,其中有一列以nvarchar(50)数据类型存储的m/d/yyyy格式的日期(我继承了这个…)。我想将这些列转换为日期数据类型,以便正确存储它们,但不能意外地将数据放入列中

我在SQLServer2008R2中尝试过这样做,使用设计器将数据类型更改为最新。这对我的测试栏有效(保留日期、更正格式等),但所有空值都变成1900-01-01。我可以接受,但似乎有一个更雄辩的解决方案

但是,当我在real data列上尝试时,收到一个错误:

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


正确的处理方法是什么?对不起,如果这是重复的。我已经找了一个小时了,还没弄明白

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

您可以做的是

  • 将另一列添加到类型为
    DATETIME

  • 通过将现有列值强制转换为
    DATETIME

  • 删除现有列


  • 显然,表中的某个位置有SQL Server无法转换为日期的数据。您可以通过以下行查询找到行:

    SELECT * FROM TableName WHERE ISDATE(ColumnName) != 1
    
    显然,您需要用实际名称替换TableName和ColumnName


    一旦您确定了包含坏数据的行,处理它就取决于您。。。手动更改每一行的数据,将它们设置为null,在这种情况下,您可以接受任何您认为可以接受的设置。

    也许您可以临时复制数据类型为date的列,这样您可以运行更新命令,将varchar转换为datetime,并在确保所有信息正确的情况下将其存储在新列中,您可以删除列并将新列重命名为其原始名称


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

    您可以使用以下查询将日期更新为
    ISO格式(yyyymmdd)
    ,这将保证在任何服务器上工作。涵盖您日期的4种可能情况,如
    'd/m/yyyy'
    'dd/m/yyyy'
    'd/mm/yyyyy'
    'dd/mm/yyyyy'
    ,并将其更新为
    ISO格式

    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查询中使用此方法

    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
    

    成功了。我运行了一个查询,显示了非日期,一些0显示为空。然后,我运行另一个查询来更新表,以将所有非日期替换为NULL,然后重试。急板地!谢谢我已经解决了如何处理,看看我的答案。这对你也有帮助。