You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark SQL中从字符串日期时间提取年份的问题咨询

解决Spark SQL提取dd/MM/yyyy格式日期年份的问题

首先得指出你当前查询里的几个关键问题,然后给你正确的实现方案:

你的查询存在的问题

  • 日期类型不匹配:你的dt字段是dd/MM/yyyy格式的字符串,但Spark的year()函数只接受Date或Timestamp类型的输入。直接对字符串调用year()会导致解析失败(因为Spark默认按yyyy-MM-dd解析日期),最终返回null,自然筛选不到任何数据。
  • WHERE子句语法与逻辑错误:
    • 你想筛选2018或2019年的记录,却用了AND,这会导致没有任何数据满足条件(一个日期不可能同时属于两年)。
    • year(dt=='2019')是完全错误的语法,dt=='2019'返回的是布尔值,year()无法处理布尔类型的输入。

正确的解决方案

核心思路是先把字符串格式的dt转换为Spark认可的日期类型,再提取年份进行筛选。这里有两种可靠的写法:

方法1:使用to_date()转换日期后筛选

SELECT * 
FROM T1 
WHERE year(to_date(dt, 'dd/MM/yyyy')) IN (2018, 2019);
  • to_date(dt, 'dd/MM/yyyy'):将字符串dt按照dd/MM/yyyy的格式转换为Date类型。
  • year(...):从转换后的日期中提取年份(整数类型)。
  • IN (2018, 2019):简洁地指定要筛选的年份范围,效果等价于year(...) = 2018 OR year(...) = 2019。

方法2:直接提取日期字符串的年份(应急可用,不推荐)

如果因为某些原因无法转换日期类型,可以直接截取dt字符串的最后4位(因为格式是dd/MM/yyyy,年份在末尾):

SELECT * 
FROM T1 
WHERE substring(dt, 7, 4) IN ('2018', '2019');

⚠️ 注意:这种方法仅适用于dt格式严格符合dd/MM/yyyy的场景,如果存在格式不规范的数据(比如少一位、分隔符错误),会得到错误的结果。优先推荐方法1。

内容的提问来源于stack exchange,提问作者UgoL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:25:20