如何将计算月末余额的MySQL查询转换为SQLite3可用语句
SQLite 适配MySQL月末统计查询的实现方案
SQLite 没有内置与MySQLLast_Day()等价的原生函数,可通过内置日期修饰符组合实现完全一致的效果,同时适配原查询里的日期格式转换、格式化逻辑,最终可直接运行的语句如下。
核心替换逻辑
原MySQL语句里的三个专有函数都可以用SQLite原生能力替换:
Str_to_date(dt.date, '%m/%d/%Y'):由于存储的日期是MM/DD/YYYY格式字符串,通过字符串截取拼接为SQLite可识别的YYYY-MM-DD格式即可,写法为substr(dt.date,7,4) || '-' || substr(dt.date,1,2) || '-' || substr(dt.date,4,2)Last_day(xxx):通用月末计算逻辑为「取日期所在月的下一月第一天,再减1天」,SQLite对应写法为date(合法日期值, 'start of month', '+1 month', '-1 day')Date_format(xxx, '%Y/%m/%d'):将计算得到的标准日期里的横杠替换为斜杠即可匹配输出格式,写法为replace(月末日期值, '-', '/')
转换完成的SQL语句
SELECT c.country, replace( date( substr(dt.date,7,4) || '-' || substr(dt.date,1,2) || '-' || substr(dt.date,4,2), 'start of month', '+1 month', '-1 day' ), '-', '/' ) AS Month_End_Balance, Sum(dt.amount) AS in_Euro FROM deposit_transactions AS dt LEFT JOIN customers AS c ON c.customer_id = dt.customer_id GROUP BY c.country, Month_End_Balance ORDER BY Month_End_Balance DESC
补充说明
如果
dt.date字段本身已经存储为SQLite支持的标准YYYY-MM-DD格式,可以去掉substr拼接转换的部分,直接将日期计算部分写为date(dt.date, 'start of month', '+1 month', '-1 day'),执行效率更高。
内容的提问来源于stack exchange,提问作者Prady_decon
相关产品推荐
相关产品推荐

