PeopleSoft Query Manager中Case语句内CONVERT函数报错排查求助
PeopleSoft Query Manager CASE语句SQL错误分析与修复
问题重现
原有效日期转换表达式:
CONVERT(VARCHAR(10), A.TERMINATION_DT, 103) AS [DD MON YY]
为指定部分员工离职日期编写的报错CASE语句(错误码8603,提示AS关键字附近语法错误):
(CASE WHEN B.EMPLID IN ('XXXXXX') THEN '2022-08-19' ELSE (CONVERT(VARCHAR(10), A.TERMINATION_DT, 103) AS [DD MON YY]) END)
错误原因
- AS别名位置错误:列别名
AS [DD MON YY]只能定义在整个CASE表达式的末尾,不能嵌套在ELSE分支的子表达式内部。CASE本身是完整的列计算表达式,分支里仅能写返回值的计算逻辑,不能包含别名定义。 - 返回值格式不一致:手动指定的
'2022-08-19'是YYYY-MM-DD格式,而CONVERT(VARCHAR(10), A.TERMINATION_DT, 103)返回的是DD/MM/YYYY格式(SQL Server中103对应英国日期格式),两者格式不统一会导致结果列内容混乱,不符合DD MON YY的格式要求。
修复后的表达式
方案1:统一为DD MON YY格式
使用格式码106(对应DD MON YYYY),截取前9位得到目标格式:
CASE WHEN B.EMPLID IN ('XXXXXX') THEN LEFT(CONVERT(VARCHAR(11), '2022-08-19', 106), 9) ELSE LEFT(CONVERT(VARCHAR(11), A.TERMINATION_DT, 106), 9) END AS [DD MON YY]
注:SQL Server中CONVERT(VARCHAR(11), '2022-08-19', 106)返回19 Aug 2022,截取前9位得到19 Aug 22,完全匹配DD MON YY格式。
方案2:先修复语法错误(格式后续统一)
若仅需解决语法报错,将别名移至CASE表达式末尾即可:
CASE WHEN B.EMPLID IN ('XXXXXX') THEN '2022-08-19' ELSE CONVERT(VARCHAR(10), A.TERMINATION_DT, 103) END AS [DD MON YY]
此方案会导致结果列同时存在两种日期格式,建议优先使用方案1统一格式。
内容的提问来源于stack exchange,提问作者Phlegon_of_Tralles
相关产品推荐
相关产品推荐

