1

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

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

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

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

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

4

5 回答 5

3

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

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

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

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

于 2013-02-07T16:34:43.903 回答
0

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

于 2013-02-07T16:33:50.650 回答
0

你能做的是

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

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

  3. 删除现有列

于 2013-02-07T16:34:26.120 回答
0

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

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

于 2013-02-07T16:38:51.217 回答
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
于 2013-02-07T17:00:52.077 回答