SQLite - 减去不同年份的月份的负值

时间:2013-02-02 15:17:59

标签: sql sqlite date

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

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语句中实现这一点并在每种情况下获得精确的值?< / p>

编辑:最后这是解决方案

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

3 个答案:

答案 0 :(得分:2)

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

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

月份返回一年中的月份。因此,像2(2月) - 9(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能够将日期添加到日期。不幸的是,它似乎没有能力在几个月之间取得差异。

答案 1 :(得分:1)

你并不是在考虑两个月之间的差异,而是考虑到他们的岁月。

所以你需要这样做:

SQLite (SQL.js) Demo

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


| MonthsDiff |
--------------
|       11.0 |
|        2.0 |

答案 2 :(得分:0)

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

你这样做了吗?

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

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

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

SELECT julianday(date()) - julianday('2012-03-03') as blah