SQLiteで2つの日付の日数の差を取得するにはどうすればよいですか?私はすでにこのようなことを試しました:
SELECT Date('now') - DateCreated FROM Payment
毎回0を返します。
SQLiteで2つの日付の日数の差を取得するにはどうすればよいですか?私はすでにこのようなことを試しました:
SELECT Date('now') - DateCreated FROM Payment
毎回0を返します。
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
日数差
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) As Integer)
時間差
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) * 24 As Integer)
分単位の差
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 As Integer)
秒単位の差
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 * 60 As Integer)
どちらの回答も、必要に応じて、もう少し複雑なソリューションを提供します。支払いが に作成されたとしJanuary 6, 2013
ます。そして、この日付と今日の違いを知りたいのです。
sqlite> SELECT julianday() - julianday('2013-01-06');
34.7978485878557
その差は34日。julianday('now')
より明確にするために使用できます。言い換えれば、
機能するためにパラメーターとしてdate()
or関数を配置する必要はありません
。datetime()
julianday()
SQLite のドキュメントは優れたリファレンスであり、DateAndTimeFunctionsページはブックマークするのに適したページです。
また、sqlite コマンド ライン ユーティリティを使用してクエリを操作するのは非常に簡単であることを覚えておくと役に立ちます。
sqlite> select julianday(datetime('now'));
2454788.09219907
sqlite> select datetime(julianday(datetime('now')));
2008-11-17 14:13:55
この回答は少し長文であり、ドキュメントではこれを説明していません (データベースに日付を UTC 日付として保存していると想定しているため)。ただし、この質問に対する回答は、日付が保存されているタイムゾーンに大きく依存します。も使用しませんDate('now')
が、julianday()
関数を使用して、共通の日付に対して両方の日付を逆に計算し、それらの結果の差を互いに減算します。
日付が UTC で保存されている場合:
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
これはトップランクの回答が持っているものであり、ドキュメントにもあります。あなたが私に尋ねるならば、それは絵の一部であり、非常に単純な答えです.
日付が現地時間で保存されている場合、上記のコードを使用すると、GMT オフセットの時間数によって回答が間違ってしまいます。あなたが私のように GMT -5 である米国東部にいる場合、結果には 5 時間が加算されます。また、GMT の日付に反するDateCreated
ため、UTC に準拠させようとすると、次のようになります。julianday('now')
SELECT julianday('now') - julianday(DateCreated, 'utc') FROM Payment;
DateCreated
これには、夏時間 (3 月から 11 月) の間は1 時間が追加されるというバグがあります。「今」が DST 以外の日の正午であり、6 月 (DST 中) の正午に何かを作成したとします。結果は、時間の部分に 0 時間ではなく、1 時間の間隔を与えます。結果を変更し、DST の日付から 1 時間を減算するには、結果を表示するアプリケーションのコードに関数を記述する必要があります。私が抱えていたその問題に対するより良い解決策があることに気付くまで、私はそれをしました: SQLite vs. Oracle - 日付の違いの計算 - 時間
代わりに、私に指摘されたように、日付が現地時間で保存されている場合は、両方を現地時間に一致させます。
SELECT julianday('now', 'localtime') - julianday(DateCreated) FROM Payment;
'Z'
または現地時間に追加します。
julianday(datetime('now', 'localtime')||'Z') - julianday(CREATED_DATE||'Z')
これらはどちらも、DST の日付の余分な時間を補正し、追加せず、直接減算を行うように見えます。そのため、DST の日の正午に作成されたアイテムは、DST 以外の日の正午にチェックすると、余分な時間が得られません。計算を実行します。
そして、ほとんどの人がデータベースに日付を現地時間で保存しないで、UTC で保存してこれに遭遇しないように言うだろうと認識していますが、すべてのアプリケーションに世界中のユーザーがいるわけではなく、すべてのプログラマーがそれを望んでいるわけでもありません。システム内のすべての日付を UTC に変換し、データベースで GET または SET を実行するたびに元に戻して、何かがローカルか UTC かを判断します。
timeclock 関数を記述するためのメモです。労働時間を探している人にとっては、これを非常に簡単に変更するだけで、ほとんどの給与計算会社が望んでいるように、時間と分が 60 のパーセンテージで表示されます。
CAST ((julianday(clockOUT) - julianday(clockIN)) * 24 AS REAL) AS HoursWorked
Clock In Clock Out HoursWorked
2016-08-07 11:56 2016-08-07 18:46 6.83333332836628
まず、日付形式が何であるかが明確ではありません。を含む回答が既にありますstrftime("%s")
。
私はその答えを拡張するのが好きです。
SQLite には、NULL、INTEGER、REAL、TEXT、または BLOB のストレージ クラスしかありません。簡単にするために、日付は 1970 年 1 月 1 日からの秒数を含む REAL であると仮定します。「2018 年 12 月 1 日」のサンプル データに入れるサンプル スキーマを次に示します。
CREATE TABLE Payment (DateCreated REAL);
INSERT INTO Payment VALUES (strftime("%s", "2018-12-01"));
ここで、「2018 年 12 月 1 日」と現在の日付の違いを計算してみましょう (これを書いている時点では、2018 年 12 月 12 日の正午です)。
日付の差 (日数):
SELECT (strftime("%s", "now") - DateCreated) / 86400.0 FROM Payment;
-- Output: 11.066875
日付の時間差:
SELECT (strftime("%s", "now") - DateCreated) / 3600.0 FROM Payment;
-- Output: 265.606388888889
日付の差 (分):
SELECT (strftime("%s", "now") - DateCreated) / 60.0 FROM Payment;
-- Output: 15936.4833333333
日付の差 (秒):
SELECT (strftime("%s", "now") - DateCreated) FROM Payment;
-- Output: 956195.0