DataFrame日期断点统计与MySQL日期筛选技术求助
CASE 2:MySQL 提取包含指定日期的行
针对同结构的MySQL表,要高效筛选包含大于2023-04-18日期的行,推荐用JSON_TABLE(MySQL 8.0+)或递归CTE拆分日期串,避免循环:
方法一:JSON_TABLE(高效推荐)
利用JSON函数拆分逗号分隔字符串,再匹配符合条件的日期:
SELECT DISTINCT t.* FROM your_table t JOIN JSON_TABLE( -- 将日期串转为JSON数组格式 CONCAT('["', REPLACE(t.date_str, ',', '","'), '"]'), '$[*]' COLUMNS (single_date VARCHAR(20) PATH '$') ) sd WHERE -- 匹配4位年份的日期(如2023-4-18) (STR_TO_DATE(sd.single_date, '%Y-%c-%e') >= '2023-04-18' AND STR_TO_DATE(sd.single_date, '%Y-%c-%e') IS NOT NULL) OR -- 匹配2位年份的日期(如20-5-17) (STR_TO_DATE(sd.single_date, '%y-%c-%e') >= '2023-04-18' AND STR_TO_DATE(sd.single_date, '%y-%c-%e') IS NOT NULL);
方法二:递归CTE(兼容低版本MySQL)
通过递归拆分日期串,再筛选符合条件的行:
WITH RECURSIVE split_dates AS ( SELECT id, -- 替换为你的表主键字段 date_str, SUBSTRING_INDEX(date_str, ',', 1) AS single_date, SUBSTRING(date_str, LENGTH(SUBSTRING_INDEX(date_str, ',', 1)) + 2) AS remaining_dates FROM your_table WHERE date_str IS NOT NULL AND date_str != '' UNION ALL SELECT id, date_str, SUBSTRING_INDEX(remaining_dates, ',', 1), SUBSTRING(remaining_dates, LENGTH(SUBSTRING_INDEX(remaining_dates, ',', 1)) + 2) FROM split_dates WHERE remaining_dates IS NOT NULL AND remaining_dates != '' ) SELECT DISTINCT t.* FROM your_table t JOIN split_dates sd ON t.id = sd.id WHERE (STR_TO_DATE(sd.single_date, '%Y-%c-%e') >= '2023-04-18' AND STR_TO_DATE(sd.single_date, '%Y-%c-%e') IS NOT NULL) OR (STR_TO_DATE(sd.single_date, '%y-%c-%e') >= '2023-04-18' AND STR_TO_DATE(sd.single_date, '%y-%c-%e') IS NOT NULL);
说明
STR_TO_DATE用%Y-%c-%e匹配无前置零的日期格式(如2023-4-18),%y-%c-%e匹配两位年份的日期DISTINCT确保原表每行只返回一次,避免拆分后重复输出- JSON_TABLE性能优于递归CTE,优先使用(需MySQL 8.0及以上版本)
内容的提问来源于stack exchange,提问作者1670511081
相关产品推荐
相关产品推荐

