【问题标题】:Converting nvarchar to date column将 nvarchar 转换为日期列
【发布时间】:2013-02-07 16:30:56
【问题描述】:

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

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

但是,当我在真实数据列上尝试时,我收到了错误:

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

处理这个问题的正确方法是什么?对不起,如果这是重复的。我一直在寻找一个小时,还没有弄清楚。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 那行得通。我运行了一个查询,显示了非日期和一些 0 出现了一些空值。然后我运行另一个查询来更新表以用 NULL 替换所有非日期,然后再试一次。快!谢谢!
    • 我已经解决了如何处理,看看我的回答。这也会对你有所帮助。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你能做的就是

      1. DATETIME类型的表中添加另一列

      2. 通过将现有列值转换为DATETIME来更新新列值

      3. 删除现有列

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          您可以使用以下查询将您的日期更新为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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-01-17
            • 2020-10-05
            • 2015-09-23
            • 1970-01-01
            • 1970-01-01
            • 2014-11-19
            • 2013-11-06
            相关资源
            最近更新 更多