如何将格式为'10:50:PM'的nvarchar类型转换为time类型?
解决nvarchar格式时间转time类型失败的问题
核心问题是你的表中存在无效格式的时间字符串,导致CAST/CONVERT或修改列类型时触发转换错误。以下是分步解决方法:
1. 定位无效数据
首先用TRY_CONVERT函数找出所有无法转换为time类型的行(该函数转换失败时返回NULL):
SELECT open, close FROM 你的表名 WHERE TRY_CONVERT(time, open) IS NULL OR TRY_CONVERT(time, close) IS NULL
检查这些结果,常见的无效格式包括:拼写错误(如把PM写成PMM)、格式不符(如缺少冒号、小时超过12)、空值或乱码等,手动修正这些数据。
2. 转换列类型(两种方法)
方法一:安全过渡(推荐)
先新增临时time列,转换数据后再替换原列:
-- 添加临时time列 ALTER TABLE 你的表名 ADD open_time time, close_time time; -- 转换数据到临时列 UPDATE 你的表名 SET open_time = CONVERT(time, open), close_time = CONVERT(time, close); -- 验证数据无误后,删除原列并重命名临时列 ALTER TABLE 你的表名 DROP COLUMN open, close; EXEC sp_rename '你的表名.open_time', 'open', 'COLUMN'; EXEC sp_rename '你的表名.close_time', 'close', 'COLUMN';
方法二:直接修改列类型(需确保所有数据有效)
确认所有数据都能正确转换后,直接修改列类型:
ALTER TABLE 你的表名 ALTER COLUMN open time; ALTER TABLE 你的表名 ALTER COLUMN close time;
3. 查询时临时转换(无需修改表结构)
如果暂时不想修改表结构,查询时用TRY_CONVERT避免报错:
SELECT TRY_CONVERT(time, open) AS open_time, TRY_CONVERT(time, close) AS close_time FROM 你的表名;
无效数据会显示为NULL,不影响整个查询执行。
内容的提问来源于stack exchange,提问作者Ifeoma Ogbodo
相关产品推荐
相关产品推荐

