我正在使用用于SQLite的数据库浏览器来设置一个简单的项目,到目前为止,我的数据库中有下表(名为“公民”):
| name | address | dob |
|=========|=============|============|
| John | Civic City | 292723200 |
| Jane | Civic City | -90374400 |
| Robert | Metro City | 503452800 |
| Sarah | Metro City | 920851200 |
| Clara | Kingshire | 114220800 |
| Matt | Kingshire | 790819200 |
请注意,“日期”(出生日期)列将日期存储为unix时间戳。
如果我使用 strftime('%s'...)在 where 子句中比较dob列的值,则一切正常。但是,如果我在 having 子句中进行了类似的比较,事情就会出错。
将 strftime('%s'...)的结果铸造为整数似乎可以解决问题,但是我不确定为什么 strftime('%s'。 ..)似乎在 having 子句中返回字符串,而在 where 子句中返回整数。
以下使用 strftime('%s'...)在 where 子句中显示有效的比较:
SELECT name FROM citizens WHERE dob < strftime('%s', 'now', '-40 years')
产生以下结果集
name |
======|
John |
Jane |
Clara |
如果我在 having 子句中进行了类似的比较,则在汇总了一些数据后,如下所示,我得到的结果集为空。
SELECT name, max(dob) FROM citizens GROUP BY address HAVING max(dob) > strftime('%s', 'now', '-30 years')
但是,如果我将 strftime('%s'...)转换为整数,则可以正常工作。
SELECT name, max(dob) FROM citizens GROUP BY address HAVING max(dob) > cast(strftime('%s', 'now', '-30 years') AS INTEGER)
并产生以下结果集:
name | max(dob) |
======|===========|
Matt | 790819200 |
Sarah | 920851200 |
where 子句和 having 子句之间的行为不同的原因是什么?是优化问题吗?