SQL修改日期字段最后两位时varchar转int报错求助
问题排查
报错原因
- 语法使用错误:
IN运算符不支持%通配符匹配,通配符仅可与LIKE运算符配合使用,你当前的where Date in ('%01','%02','%03')写法本身不符合SQL语法规则。 - 类型不匹配报错:你的
Date字段为int类型(存储YYYYMM格式的数值),执行WHERE条件时数据库会自动尝试将'%01'这类带通配符的字符串转为int类型与Date字段匹配,转换失败就会抛出你遇到的Conversion failed when converting the varchar value '%02' to data type int错误。 - 需求偏离:你当前代码是修改原有
Date字段的值,没有新增目标字段FiscalQrtr,不符合生成新列的需求。
正确实现方案
这里提供两种常用实现方式,你可以根据使用场景选择:
方案1:临时表新增字段持久化存储
针对Date为int类型的场景(最常见的YYYYMM存储格式),可以用数学计算直接生成季度值,无需字符串拼接,性能更好:
-- 复制原表同时新增FiscalQrtr列 select *, (Date / 100)*100 + ((Date % 100 -1)/3 +1) as FiscalQrtr into #claims1 FROM #claims
如果Date为varchar类型,使用如下写法:
select *, left(Date,4) + right('0' + cast((cast(right(Date,2) as int) -1)/3 +1 as varchar(2)),2) as FiscalQrtr into #claims1 FROM #claims
方案2:查询时动态生成(无需修改表结构)
如果不需要持久化存储该字段,直接在查询语句中计算即可:
select *, (Date / 100)*100 + ((Date % 100 -1)/3 +1) as FiscalQrtr from #claims
内容的提问来源于stack exchange,提问作者2020db9
相关产品推荐
相关产品推荐

