SQL Server转Snowflake查询报错:无法将'04/17/22'转换为数值
SQL Server转Snowflake查询类型转换错误修复
报错原因
你遇到的「无法将'04/17/22'转换为数值类型」错误来自两个写法问题:
- 你的表中
system_modstamp字段是MM/DD/YY格式的字符串类型(比如报错里的04/17/22),直接对字符串调用TO_VARCHAR(字段, 'YYYY-MM-DD')时,Snowflake会尝试把字符串隐式转成日期/数值类型,格式不匹配就会抛错。 - Snowflake中
+默认是数值加法运算符,你用+拼接字符串时,引擎会尝试把两边的内容转成数值再计算,进一步触发了类型转换错误。
另外你写的日期转换格式和原SQL Server的逻辑长度不匹配,就算绕过报错,后续截断字符串得到的角色值也会出错。
正确写法
对齐原SQL逻辑的兼容版
完全保留原SQL的拼接截断思路,只修复类型转换和拼接符问题:
SELECT user_id AS u_id, SUBSTR( MAX( -- 先显式把MM/DD/YY格式的字符串转日期,再转成和SQL Server 121格式一致的10位YYYY-MM-DD字符串 TO_VARCHAR(TO_DATE(system_modstamp, 'MM/DD/YY'), 'YYYY-MM-DD') || -- 用||做字符串拼接,避免+触发数值转换 CASE WHEN team_member_role LIKE 'AM%' OR team_member_role LIKE '%AM %' OR team_member_role LIKE 'ASR%' THEN 'AM Sales' WHEN team_member_role LIKE '%fsr%' THEN 'FSR' WHEN team_member_role LIKE '%RSD%' AND team_member_role NOT LIKE '%parts%' THEN 'AC Sales' WHEN team_member_role LIKE 'RSA%' THEN 'AC Sales' ELSE team_member_role END ), 11, 99 -- 前10位是日期字符串,从11位开始截断就是需要的角色分组值 ) AS team_groups, MAX(TO_DATE(system_modstamp, 'MM/DD/YY')) AS SYSTEM_MODSTAMP FROM S_SFDC_ACCOUNT_TEAM GROUP BY user_id;
如果你的
system_modstamp字段本身已经是DATE/TIMESTAMP类型,直接把代码里的TO_DATE(system_modstamp, 'MM/DD/YY')替换成system_modstamp即可。
Snowflake原生优化版
原SQL的拼接截断写法是早年SQL Server没有窗口函数时的折中方案,Snowflake支持窗口函数,可以直接过滤出每个用户最新的记录,逻辑更清晰,也没有字符串截断的风险:
SELECT user_id AS u_id, CASE WHEN team_member_role LIKE 'AM%' OR team_member_role LIKE '%AM %' OR team_member_role LIKE 'ASR%' THEN 'AM Sales' WHEN team_member_role LIKE '%fsr%' THEN 'FSR' WHEN team_member_role LIKE '%RSD%' AND team_member_role NOT LIKE '%parts%' THEN 'AC Sales' WHEN team_member_role LIKE 'RSA%' THEN 'AC Sales' ELSE team_member_role END AS team_groups, TO_DATE(system_modstamp, 'MM/DD/YY') AS SYSTEM_MODSTAMP FROM S_SFDC_ACCOUNT_TEAM -- 按用户分区,按修改时间倒序,只取每个用户最新的1条记录 QUALIFY ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY TO_DATE(system_modstamp, 'MM/DD/YY') DESC) = 1;
内容的提问来源于stack exchange,提问作者ccmiller10
相关产品推荐
相关产品推荐

