如何拆分单列中的起止日期并用于数据查询?
拆分合并起止日期并用作查询条件的方法
嘿,这个场景我熟!要拆分这种格式的合并日期串(比如'23 March, 2018 - 23 April, 2018'),再把它们用作查询条件,核心思路就是先拆分出起止日期的字符串部分,再转换成数据库能识别的日期类型,最后就能直接在查询条件里用了。不同数据库的实现略有差异,我给你列几个常用的方案:
MySQL 实现方案
- 提取并转换起始日期:用
SUBSTRING_INDEX拆分出分隔符' - '左侧的起始日期字符串,再用STR_TO_DATE转换成日期格式:STR_TO_DATE(SUBSTRING_INDEX(date_range, ' - ', 1), '%d %M, %Y') AS start_date - 提取并转换结束日期:同样用
SUBSTRING_INDEX取分隔符右侧的部分,转成日期:STR_TO_DATE(SUBSTRING_INDEX(date_range, ' - ', -1), '%d %M, %Y') AS end_date - 直接用作查询条件:比如要筛选起始日期在2018年3月的记录,直接把转换逻辑放进
WHERE子句:SELECT * FROM your_table WHERE STR_TO_DATE(SUBSTRING_INDEX(date_range, ' - ', 1), '%d %M, %Y') BETWEEN '2018-03-01' AND '2018-03-31';
SQL Server 实现方案
- 提取并转换起始日期:用
CHARINDEX定位分隔符位置,截取左侧字符串后用CONVERT转成日期(样式码106对应dd MMM yyyy格式):CONVERT(DATE, LEFT(date_range, CHARINDEX(' - ', date_range) - 1), 106) AS start_date - 提取并转换结束日期:截取分隔符右侧的字符串再转日期:
CONVERT(DATE, RIGHT(date_range, LEN(date_range) - CHARINDEX(' - ', date_range) - 2), 106) AS end_date - 查询条件示例:比如筛选起止日期覆盖2018年第一季度的记录:
SELECT * FROM your_table WHERE CONVERT(DATE, LEFT(date_range, CHARINDEX(' - ', date_range) - 1), 106) >= '2018-01-01' AND CONVERT(DATE, RIGHT(date_range, LEN(date_range) - CHARINDEX(' - ', date_range) - 2), 106) <= '2018-03-31';
PostgreSQL 实现方案
- 提取并转换起始日期:用
SPLIT_PART按分隔符拆分字符串,再用TO_DATE转成日期:TO_DATE(SPLIT_PART(date_range, ' - ', 1), 'DD Month, YYYY') AS start_date - 提取并转换结束日期:取拆分后的第二个部分转日期:
TO_DATE(SPLIT_PART(date_range, ' - ', 2), 'DD Month, YYYY') AS end_date - 查询条件示例:比如筛选结束日期在2018年4月的记录:
SELECT * FROM your_table WHERE TO_DATE(SPLIT_PART(date_range, ' - ', 2), 'DD Month, YYYY') BETWEEN '2018-04-01' AND '2018-04-30';
小提示
如果你的数据表数据量很大,每次查询都实时拆分转换会影响性能,建议提前把拆分后的起止日期存储为单独的DATE类型字段,这样后续查询效率会高很多!
内容的提问来源于stack exchange,提问作者j sharma
相关产品推荐
相关产品推荐

