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 (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 には、日付に月を追加する機能があります。残念ながら、日付間の月の差を取る機能はないようです。

于 2013-02-02T15:33:42.617 に答える
2

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 に答える