如何不使用CURDATE等日期函数编写兼容MySQL与SQLite的当月记录查询
兼容MySQL与SQLite3的当月记录统一查询方案
核心前提
so_date字段为固定YYYY-MM-DD格式的日期/字符串类型,该格式的日期字符串字典序与时间序完全一致,可基于字符串匹配逻辑实现跨库兼容,无需调用任何数据库特有日期函数。
推荐方案:应用层生成前缀(性能最优、兼容性最好)
- 实现逻辑:在业务代码中预先计算出当前年月的字符串前缀,格式为
YYYY-MM,直接带入SQL做前缀匹配 - 统一可执行SQL示例(以2024年5月为例):
SELECT so_no, so_date FROM so_master WHERE so_date LIKE '2024-05%';
- 优势:
- 完全不依赖
CURDATE、MONTH、YEAR等数据库特有日期函数,可在MySQL、SQLite3及所有主流关系型数据库中正常运行 - 查询可命中
so_date字段的索引,性能远高于日期函数转换后比较的写法 - 逻辑简单易维护,无需根据数据库类型做分支判断
- 完全不依赖
备选方案:纯SQL层实现
如果不允许在应用层处理日期逻辑,可使用如下兼容写法,利用两个数据库都支持的字符串截取和通用日期取值逻辑实现:
SELECT so_no, so_date FROM so_master WHERE SUBSTRING(so_date, 1, 7) = CASE WHEN VERSION() LIKE '%MySQL%' THEN DATE_FORMAT(NOW(), '%Y-%m') ELSE strftime('%Y-%m', 'now') END;
注:该方案仅适用于需要纯SQL实现的场景,性能低于应用层前缀匹配方案,无法命中
so_date字段索引。
内容的提问来源于stack exchange,提问作者vijay kumar
相关产品推荐
相关产品推荐

