清洗nvarchar日期列遇计算列错误,求转DATE格式解决方案
解决SQL Server中nvarchar日期转换为DATE类型的问题
你不需要拆分出day、month、year这些中间计算列,SQL Server不允许计算列直接引用其他虚拟计算列,这就是你报错的原因。直接一步转换即可完成需求:
方法一:创建DATE类型的计算列
如果要直接得到YYYY-MM-DD格式的DATE类型列,使用TRY_CONVERT(或CONVERT)配合对应格式代码即可:
ALTER TABLE mytable ADD new_DCR_Date AS TRY_CONVERT(DATE, Last_DCR_Date, 105) PERSISTED;
105是SQL Server对应DD-MM-YYYY格式的style代码,正好匹配你原始数据24-11-2023的格式TRY_CONVERT会自动处理格式错误的行(返回NULL),如果确认所有数据格式都正确,也可以用CONVERT替代- 加上
PERSISTED可以让计算列的数据持久化存储,提升查询性能
方法二:直接更新为物理DATE列(如果不需要保留原始计算逻辑)
如果不需要动态计算,而是想直接把数据转换后存储为DATE类型,可以先添加列再更新:
-- 先添加DATE类型的列 ALTER TABLE mytable ADD new_DCR_Date DATE; -- 更新数据 UPDATE mytable SET new_DCR_Date = TRY_CONVERT(DATE, Last_DCR_Date, 105);
为什么你的原始方法报错
你创建的day、month、year都是虚拟计算列(未加PERSISTED),SQL Server不允许计算列依赖其他虚拟计算列。即使把这些中间列设置为PERSISTED,这种拆分再拼接的方法也完全没必要,不仅繁琐,还容易因为数据格式问题(比如单数字的日/月)导致转换错误。
内容的提问来源于stack exchange,提问作者Bori
相关产品推荐
相关产品推荐

