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