我有一个表格,其中有一列日期为m / d / yyyy格式,存储在 nvarchar(50)数据类型中(我继承了这个...)。我想将这些列转换为 date 数据类型,以便正确存储它们,但不能不小心丢弃列中的数据。
我已尝试在SQL Server 2008R2中执行此操作,使用设计器将数据类型更改为日期。这适用于我的测试列(保留日期,更正格式等),但所有空值变为1900-01-01。我可以忍受这一点,但似乎有一个更有说服力的解决方案。
然而,当我在真实数据列上尝试它时,我收到一个错误:
无法修改表格。从字符串转换日期和/或时间时转换失败。
处理此问题的正确方法是什么?对不起,如果这是重复的。我一直在寻找一个小时,但没想出来。
答案 0 :(得分:3)
您显然在表中某处SQL Server无法转换为日期的数据。您可以在以下行中找到带有查询的行:
SELECT * FROM TableName WHERE ISDATE(ColumnName) != 1
显然,您需要将TableName和ColumnName替换为实际名称。
一旦您确定了包含错误数据的行,处理它取决于您...为每行手动更改数据,将它们设置为null,无论您认为在这种情况下是否可接受。
答案 1 :(得分:0)
我建议您添加一个带有Date数据类型的新列,然后转换/复制数据,最后删除原始列。
答案 2 :(得分:0)
你可以做的是
将另一列添加到DATETIME
通过将现有列值转换为DATETIME
删除现有列
答案 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