web-dev-qa-db-ja.com

SQLiteの2つの日付の違い

SQLiteで2つの日付の日数の差を取得するにはどうすればよいですか?私はすでにこのようなことを試しました:

SELECT Date('now') - DateCreated FROM Payment

毎回0を返します。

92
Johan
 SELECT julianday('now') - julianday(DateCreated) FROM Payment;
104
Fred

日数の差

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)
44
Sayka

どちらの答えも、必要に応じてソリューションをもう少し複雑にします。支払いが_January 6, 2013_で作成されたとします。そして、この日付と今日の違いを知りたいです。

_sqlite> SELECT julianday() - julianday('2013-01-06');
34.7978485878557 
_

差は34日です。より明確にするために、julianday('now')を使用できます。つまり、date()関数またはdatetime()関数をjulianday()関数のパラメーターとして配置する必要はありません。

31
Jan Bodnar

SQLite wikiは素晴らしいリファレンスであり、 DateAndTimeFunctions ページはブックマークするのに適しています。また、sqliteコマンドラインユーティリティを使用してクエリを簡単に再生できることを覚えておくと役立ちます。

sqlite> select julianday(datetime('now'));
2454788.09219907
sqlite> select datetime(julianday(datetime('now')));
2008-11-17 14:13:55
20
converter42

この回答は少し長めで、ドキュメントにはこれが記載されていません(データベースに日付をUTC日付として保存していると仮定しているため)が、この質問に対する答えは、日付が保存されているタイムゾーンに大きく依存しますin。また、Date('now')は使用しませんが、julianday()関数を使用して、両方の日付を共通の日付に対して計算し、それらの結果の差を互いに減算します。

日付がUTCで保存されている場合:

_SELECT julianday('now') - julianday(DateCreated) FROM Payment;
_

これは、トップランクの答えが持っているものであり、 ドキュメント にもあります。あなたが私に尋ねると、それは絵の一部であり、非常に単純な答えです。

日付が現地時間で保存されている場合、上記のコードを使用すると、回答数[〜#〜] wrong [〜#〜] GMTオフセットは何時間ですか。あなたが私のような東部アメリカ(GMT -5)にいる場合、結果には5時間が加算されます。 julianday('now')はGMT日付に反するため、DateCreatedをUTCに準拠させようとすると:

_SELECT julianday('now') - julianday(DateCreated, 'utc') FROM Payment;
_

これには、夏時間(3月-11月)中にDateCreatedに1時間を追加するバグがあります。 「現在」はDST以外の日の正午であり、正午に(DSTの間に)6月に何かを作成したとすると、結果は時間部分で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のいずれであるかを判断します。

4
vapcguy

タイムクロック関数を記述するためのメモ。勤務時間を探している人のために、これを非常に簡単に変更すると、時間に加えて分が、ほとんどの給与計算会社が望む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
2
Gary

あなたが00:00形式の時間を望むなら:私はそれをそのように解決しました:

select strftime('%H:%M',CAST ((julianday(FinishTime) - julianday(StartTime)) AS REAL),'12:00') from something
2
Matas Lesinskas

まず、日付の形式が明確ではありません。 strftime("%s")に関連する回答が既にあります。

私はその答えを拡大したいです。

SQLiteには、次のストレージクラスのみがあります:NULL、INTEGER、REAL、TEXT、またはBLOB。物事を簡素化するために、日付は1970-01-01以降の秒を含む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
0
Stephen Quan

間に記録が必要な場合は、

select count(col_Name) from dataset where cast(julianday("now")- julianday(_Last_updated) as int)<=0;
0

私の場合、分単位の差を計算する必要があり、julianday()は正確な値を与えません。代わりに、strftime()を使用します。

SELECT strftime('%s', [UserEnd]) - strftime('%s', [UserStart])) / 60

両方の日付はunixtime(秒)に変換され、2つの日付の間の秒単位の値を取得するために減算されます。次に、それを60で割ります。

https://www.sqlite.org/cvstrac/wiki?p=DateAndTimeFunctions

日付形式が「YYYY-MM-DD HH:MM:SS」の場合、月数で2つの日付の違いを見つける必要がある場合:

(strftime('%m', date1) + 12*strftime('%Y', date1)) - (strftime('%m', date2) + 12*strftime('%Y', date2))

0
Ashish Koshy