从长字符串字段提取日期字段:SQL代码调试求助
你的SQL代码错误分析及修正
错误点说明
- 语法结构错误:嵌套的
CASE和CAST用法混乱,内层缺失完整的CASE结构,且CAST的包裹位置错误。正确逻辑应该是用CAST包裹完整的CASE判断语句,而非将WHEN直接放在CAST中。 - 日期截取逻辑不严谨:依赖固定长度和单一逗号位置判断的方式无法适配所有月份(比如
January是7个字符,May只有3个),很容易出现截取错误,无法覆盖所有日期格式。
修正后的代码示例
通用解法(无需逐个判断月份)
因为你的日期格式是标准英文日期格式,SQL可以直接识别这类字符串为DATE类型,只需提取出日期部分即可:
SELECT id, properties_content, -- 提取从开头到年份后第一个空格前的内容,转换为DATE类型 CAST(LEFT(properties_content, CHARINDEX(' ', properties_content, CHARINDEX(' ', properties_content, CHARINDEX(' ', properties_content) + 1) + 1) - 1) AS DATE) AS date_column FROM your_table
针对你原有思路的修正(保留月份判断)
如果坚持按月份逐个处理,先修正语法错误,同时调整截取逻辑:
SELECT id, properties_content, CASE WHEN SUBSTRING(properties_content, 1, 3) = 'Jan' THEN -- 先通过CASE判断日期长度,再整体转换为DATE CAST(CASE WHEN CHARINDEX(',', properties_content) = 10 THEN SUBSTRING(properties_content, 1, 15) ELSE SUBSTRING(properties_content, 1, 16) END AS DATE) -- 后续可添加其他月份的判断逻辑,比如Feb、Mar等 WHEN SUBSTRING(properties_content, 1, 3) = 'Feb' THEN CAST(LEFT(properties_content, CHARINDEX(' ', properties_content, CHARINDEX(',', properties_content) + 2) - 1) AS DATE) END AS date_column FROM your_table
内容的提问来源于stack exchange,提问作者marceloasr
相关产品推荐
相关产品推荐

