如何筛选INT格式日期列?SQL类型不匹配错误求助
解决INT类型日期列筛选最近7天数据的问题
错误原因很明确:tbl_date是INT类型(格式yyyymmdd),而current_date - interval '7' day返回的是DATE类型,SQL不允许不同类型直接比较,必须统一两边的数据类型。下面提供两种可行方案:
方案一:将INT日期转换为DATE类型后比较
把tbl_date转换为DATE类型,和右侧的日期值进行比较,语法和你之前用的date_parse一致:
SELECT date_parse(cast(tbl_date as varchar), '%Y%m%d') AS Date, -- 替换为你需要查询的其他列 FROM 交易表 WHERE date_parse(cast(tbl_date as varchar), '%Y%m%d') >= current_date - interval '7' day;
⚠️ 注意:如果表数据量较大,这种逐行转换的方式会导致tbl_date上的索引失效,查询性能会下降。
方案二:将计算出的日期转换为INT类型(推荐)
把“最近7天的起始日期”转换为yyyymmdd格式的INT值,和tbl_date直接比较,这样两边都是INT类型,能利用索引,性能更优。不同SQL方言的写法略有差异:
Hive/Spark SQL 版本
SELECT date_parse(cast(tbl_date as varchar), '%Y%m%d') AS Date, -- 替换为你需要查询的其他列 FROM 交易表 WHERE tbl_date >= cast(date_format(current_date - interval '7' day, 'yyyyMMdd') AS INT);
PostgreSQL 版本
SELECT to_date(tbl_date::varchar, 'YYYYMMDD') AS Date, -- 替换为你需要查询的其他列 FROM 交易表 WHERE tbl_date >= cast(to_char(current_date - interval '7 day', 'YYYYMMDD') AS INT);
MySQL 版本
SELECT str_to_date(tbl_date, '%Y%m%d') AS Date, -- 替换为你需要查询的其他列 FROM 交易表 WHERE tbl_date >= cast(date_format(current_date - interval 7 day, '%Y%m%d') AS UNSIGNED);
内容的提问来源于stack exchange,提问作者Zaahid Munshi
相关产品推荐
相关产品推荐

