0

我正在尝试检索计算的月份值:

SELECT strftime('%m', 'now') - strftime('%m', e.date) AS something FROM ...

但这是我得到的结果以及我真正想要的结果:

NOW - 2012-02-03 = 0 // want 11
NOW - 2012-11-02 = -9 // want 3
NOW - 2012-02-02 = 0 // want 12
NOW - 2012-01-02 = 1 // want 13

正如我所看到的,我几乎可以通过这样做sqlResult + 12(第一个示例除外)获得正确的值,但是有没有办法直接在 SQL 语句中实现这一点并在每种情况下获得准确的值?

编辑:最后这里是解决方案

SELECT CAST ((julianday('now') - julianday(e.date_retour)) / 30 AS integer) AS something
4

3 回答 3

3

您需要将年份考虑在内。你可以这样做:

select strftime('%Y', 'now')*12+strftime('%m', 'now') -
       (strftime('%Y', e.date)*12+strftime('%m', e.date))

月份返回一年中的月份。因此,像 2(二月)- 9(九月)这样的数字会产生负数也就不足为奇了。

要处理月份中的某一天,我认为您必须自己处理日期算术:

select (strftime('%Y', 'now')*12+strftime('%m', 'now') -
        (strftime('%Y', e.date)*12+strftime('%m', e.date))
       ) -
       (case when strftime('%d', 'now') < strftime('%d', e.date) then 0 else 1 end)

SQLite 能够为日期添加月份。不幸的是,它似乎没有能力计算日期之间的月差。

于 2013-02-02T15:33:42.617 回答
2

您并不是真的在看两个月之间的差异,而是考虑到他们的年份。

所以你需要这样做:

SQLite (SQL.js) 演示

SELECT round((julianday(Date('now')) - 
        julianday(Dates))/30) as MonthsDiff
from demo;


| MonthsDiff |
--------------
|       11.0 |
|        2.0 |
于 2013-02-02T15:42:25.253 回答
0

你得到了奇怪的数字,因为你要求 strftime 函数只返回月份,然后你只减去月份......

你这样做怎么样?

SELECT strftime('%s', date()) - strftime('%s', '2012-03-03') as blah

这将减去 unix 时间戳,然后您可以将其转换回可读的月份或其他...

或者这可以给你天数......

SELECT julianday(date()) - julianday('2012-03-03') as blah
于 2013-02-02T15:33:33.153 回答