我正在尝试检索计算的月份值:
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
答案 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)
你并不是在考虑两个月之间的差异,而是考虑到他们的岁月。
所以你需要这样做:
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