如何在Delphi中解决SQLite日期范围SUM()计算异常问题?
解决SQLite日期范围求和错误与空结果浮点异常问题
让我逐个帮你搞定这两个SQLite的问题:
问题1:日期范围求和结果不正确
你的求和结果出错,大概率是日期比较逻辑的问题,常见原因有两个:
- StartDate字段如果是文本类型,存储格式和查询时用的格式不统一(比如存的是
YYYY-MM-DD但你用YYYY/MM/DD做比较) - 范围条件没包含边界日期(比如用了
StartDate > '2018/01/01' AND StartDate < '2018/01/02',漏掉了当天的数据)
解决方案:
用SQLite内置的DATE()函数统一处理日期格式,同时明确包含边界日期:
SELECT SUM(Montant) AS TotalMontant FROM YourTableName -- 先把存储的日期格式转换为SQLite认可的YYYY-MM-DD,再做范围比较 WHERE DATE(REPLACE(StartDate, '/', '-')) BETWEEN DATE('2018-01-01') AND DATE('2018-01-02');
如果你的StartDate已经是YYYY-MM-DD格式,可以去掉REPLACE部分直接用DATE(StartDate)。
问题2:无匹配数据时触发浮点异常
SQLite里当没有符合条件的记录时,SUM(Montant)会返回NULL而不是0——这就是触发浮点异常的根源(很多编程语言无法直接把NULL转换成浮点数),而Absolute Database默认会返回0,所以需要我们给SQLite加个显式处理。
解决方案:
用COALESCE()函数把NULL结果替换成0,这样不管有没有匹配数据,都会返回一个有效的数值:
SELECT COALESCE(SUM(Montant), 0) AS TotalMontant FROM YourTableName WHERE DATE(REPLACE(StartDate, '/', '-')) BETWEEN DATE('2018-01-06') AND DATE('2018-01-10');
COALESCE会返回第一个非NULL的值,所以当SUM结果为NULL时,就会返回0,彻底解决空结果导致的异常问题。
内容的提问来源于stack exchange,提问作者Kerbadou Ghazali
相关产品推荐
相关产品推荐

