strftime在where子句中返回整数,但在Have子句中返回字符串

时间:2019-09-09 07:49:52

标签: sql sqlite

我正在使用用于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 子句之间的行为不同的原因是什么?是优化问题吗?

0 个答案:

没有答案