SQL - 从字符串转换日期 and/or 时间时转换失败

SQL - Conversion failed when converting date and/or time from character string

我正在处理的数据库中有 3 个表。在 3 个表中,有两个表具有包含日期​​的列。当我检查列的信息模式时,我发现日期的数据类型有误。如果您看到下图,突出显示的列应存储为 DATE 数据类型。

因此,我使用以下查询将其数据类型从 varchar 更改为 DATE

ALTER TABLE [dbo].[Customer]
ALTER COLUMN DOB DATE;

ALTER TABLE [dbo].[Transactions]
ALTER COLUMN tran_date DATE;

我得到的错误是:

Conversion failed when converting date and/or time from character string.

请告诉我如何修复此错误。谢谢!

您可以先使用 try_convert() 更新值,然后更改列名。 注意:这会将任何无效值设置为 NULL

update customer
    set dob = try_convert(date, dob);

alter table customer alter column dbo date;

如果你想看到错误的值,那么在你改变table之前,运行:

select c.*
from customer c
where try_convert(date, dob) is null and dob is not null;

您可能对如何修复这些值有其他想法。

您不能通过更改列来将 varchar 更改为 date 或 time 或 datetime。为什么?因为 SQL 服务器不知道该字段是否包含 '1/1/2020' 或 'My dog is cute'。您必须使用正确的数据类型重建 table,然后 CAST()CONVERT() 将值重建为真实的日期时间。

在引擎盖下,这更有意义。 char/varchar 每个字符使用一个字节。 nchar/nvarchar 每个字符使用 2 个字节。日期时间是数字,而不是字符。这意味着您需要一个将其更改为正确数字的例程。如果要更深一点,这个数字是从公历0001年1月1日午夜开始的刻度数(纳秒)。 More info.