Wie erhalte ich die Differenz in Tagen zwischen zwei Daten in SQLite? Ich habe schon so etwas ausprobiert:
SELECT Date('now') - DateCreated FROM Payment
Es wird jedes Mal 0 zurückgegeben.
Wie erhalte ich die Differenz in Tagen zwischen zwei Daten in SQLite? Ich habe schon so etwas ausprobiert:
SELECT Date('now') - DateCreated FROM Payment
Es wird jedes Mal 0 zurückgegeben.
Antworten:
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
DateCreated
in UTC sind. Wenn es stattdessen Ortszeit ist, müssen Sie julianday('now')
in Ortszeit konvertieren . Ich konnte nirgendwo diese Informationen finden. Wenn Ihnen julianday('now') - julianday(DateCreated)
dieser Beitrag mit einem in der Ortszeit gespeicherten Datum gefällt, wird Ihre Antwort durch Ihren Versatz von GMT verschoben und ist falsch. Obwohl es möglicherweise nicht empfehlenswert ist, Daten in der Ortszeit zu speichern, kann dies dennoch in Apps vorkommen, in denen Zeitzonen keine Rolle spielen (außer wenn das Tool, mit dem Sie arbeiten, sie Ihnen aufzwingt, wie hier).
julianday('now') - julianday(DateCreated, 'utc')
funktioniert dies nicht auf die gleiche Weise wie bei UTC julianday('now', 'localtime') - julianday(DateCreated)
. Ersteres berücksichtigt keine Sommerzeit und fügt den erstellten Daten im März-November eine zusätzliche Stunde hinzu. Letzteres erklärt es tatsächlich. stackoverflow.com/questions/41007455/…
Unterschied in Tagen
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) As Integer)
Unterschied in Stunden
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) * 24 As Integer)
Unterschied in Minuten
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 As Integer)
Unterschied in Sekunden
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 * 60 As Integer)
Beide Antworten bieten Lösungen, die etwas komplexer sind, als sie sein müssen. Angenommen, die Zahlung wurde am erstellt January 6, 2013
. Und wir wollen den Unterschied zwischen diesem Datum und heute wissen.
sqlite> SELECT julianday() - julianday('2013-01-06');
34.7978485878557
Die Differenz beträgt 34 Tage. Wir können julianday('now')
für eine bessere Klarheit verwenden. Mit anderen Worten, wir müssen nicht
date()
oder datetime()
Funktionen als Parameter setzen, um zu julianday()
funktionieren.
Die SQLite-Dokumentation ist eine hervorragende Referenz, und die Seite DateAndTimeFunctions eignet sich gut als Lesezeichen.
Es ist auch hilfreich, sich daran zu erinnern, dass das Spielen mit Abfragen mit dem Befehlszeilenprogramm sqlite ziemlich einfach ist:
sqlite> select julianday(datetime('now'));
2454788.09219907
sqlite> select datetime(julianday(datetime('now')));
2008-11-17 14:13:55
Diese Antwort ist etwas langwierig, und die Dokumentation sagt Ihnen dies nicht (da davon ausgegangen wird, dass Sie Ihre Daten als UTC-Daten in der Datenbank speichern). Die Antwort auf diese Frage hängt jedoch weitgehend von der Zeitzone ab, in der Ihre Daten gespeichert sind in. Sie verwenden auch nicht Date('now')
, aber verwenden Sie diejulianday()
Funktion , um beide Daten gegen ein gemeinsames Datum zu berechnen und dann die Differenz dieser Ergebnisse voneinander zu subtrahieren.
Wenn Ihre Daten in UTC gespeichert sind:
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
Dies ist, was die hochrangige Antwort hat, und ist auch in der Dokumentation . Es ist nur ein Teil des Bildes und eine sehr vereinfachte Antwort, wenn Sie mich fragen.
Wenn Ihre Daten in der Ortszeit gespeichert sind, wird Ihre Antwort mit dem obigen Code FALSCH um die Anzahl der Stunden, die Ihr GMT-Offset beträgt. Wenn Sie wie ich in den östlichen USA sind, was GMT -5 ist, werden Ihrem Ergebnis 5 Stunden hinzugefügt. Und wenn Sie versuchen, DateCreated
sich an UTC anzupassen, weil dies julianday('now')
gegen ein GMT-Datum verstößt:
SELECT julianday('now') - julianday(DateCreated, 'utc') FROM Payment;
Dies hat einen Fehler, bei dem eine Stunde für eine DateCreated
Sommerzeit (März-November) hinzugefügt wird . Angenommen, "jetzt" ist an einem Tag außerhalb der Sommerzeit mittags, und Sie haben im Juni (während der Sommerzeit) mittags etwas erstellt. Ihr Ergebnis ergibt für den Stundenanteil einen Abstand von 1 Stunde anstelle von 0 Stunden. Sie müssten eine Funktion in den Code Ihrer Anwendung schreiben, die das Ergebnis anzeigt, um das Ergebnis zu ändern und eine Stunde von den Sommerzeitdaten abzuziehen. Ich habe das getan, bis mir klar wurde, dass es eine bessere Lösung für dieses Problem gibt: SQLite vs. Oracle - Berechnung von Datumsunterschieden - Stunden
Wie mir bereits mitgeteilt wurde, stimmen beide Daten, die in der Ortszeit gespeichert sind, mit der Ortszeit überein:
SELECT julianday('now', 'localtime') - julianday(DateCreated) FROM Payment;
Oder 'Z'
an die Ortszeit anhängen :
julianday(datetime('now', 'localtime')||'Z') - julianday(CREATED_DATE||'Z')
Beide scheinen die zusätzliche Stunde für DST-Daten zu kompensieren und addieren sie nicht und führen eine direkte Subtraktion durch. Daher wird das Element, das an einem DST-Tag um 12.00 Uhr erstellt wird, wenn es an einem Nicht-DST-Tag um 12.00 Uhr überprüft wird, keine zusätzliche Stunde erhalten, wenn Berechnung durchführen.
Und obwohl ich weiß, dass die meisten sagen werden, dass Datumsangaben nicht in Ortszeit in Ihrer Datenbank gespeichert werden und dass sie in UTC gespeichert werden sollen, damit Sie nicht darauf stoßen, hat nicht jede Anwendung ein weltweites Publikum und nicht jeder Programmierer möchte dies jedes Mal, wenn sie ein GET oder SET in der Datenbank ausführen, die Konvertierung JEDES Datums in ihrem System in UTC und wieder zurück zu durchlaufen und herauszufinden, ob etwas lokal oder in UTC ist.
Nur eine Notiz zum Schreiben von Zeitschaltuhrfunktionen. Für diejenigen, die nach geleisteten Arbeitsstunden suchen, werden bei einer sehr einfachen Änderung die Stunden plus die Minuten als Prozentsatz von 60 angezeigt, wie es die meisten Lohn- und Gehaltsabrechnungsunternehmen wünschen.
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
Wenn Sie Zeit im 00:00-Format haben möchten: Ich habe es so gelöst:
select strftime('%H:%M',CAST ((julianday(FinishTime) - julianday(StartTime)) AS REAL),'12:00') from something
Wenn Ihr Datumsformat wie folgt lautet: "JJJJ-MM-TT HH: MM: SS", wenn Sie den Unterschied zwischen zwei Daten in der Anzahl der Monate ermitteln müssen:
(strftime('%m', date1) + 12*strftime('%Y', date1)) -
(strftime('%m', date2) + 12*strftime('%Y', date2))
Erstens ist nicht klar, wie Ihr Datumsformat lautet. Es gibt bereits eine Antwort mitstrftime("%s")
.
Ich möchte diese Antwort erweitern.
SQLite hat nur die folgenden Speicherklassen: NULL, INTEGER, REAL, TEXT oder BLOB. Zur Vereinfachung gehe ich davon aus, dass die Daten REAL sind und die Sekunden seit dem 01.01.1970 enthalten. Hier ist ein Beispielschema, für das ich die Beispieldaten vom "1. Dezember 2018" einfügen werde:
CREATE TABLE Payment (DateCreated REAL);
INSERT INTO Payment VALUES (strftime("%s", "2018-12-01"));
Lassen Sie uns nun den Datumsunterschied zwischen "1. Dezember 2018" und jetzt herausarbeiten (während ich dies schreibe, ist es Mittag, 12. Dezember 2018):
Datumsunterschied in Tagen:
SELECT (strftime("%s", "now") - DateCreated) / 86400.0 FROM Payment;
-- Output: 11.066875
Datumsunterschied in Stunden:
SELECT (strftime("%s", "now") - DateCreated) / 3600.0 FROM Payment;
-- Output: 265.606388888889
Datumsunterschied in Minuten:
SELECT (strftime("%s", "now") - DateCreated) / 60.0 FROM Payment;
-- Output: 15936.4833333333
Datumsunterschied in Sekunden:
SELECT (strftime("%s", "now") - DateCreated) FROM Payment;
-- Output: 956195.0
Wenn Sie einen Unterschied in Sekunden wollen
SELECT strftime('%s', '2019-12-02 12:32:53') - strftime('%s', '2019-12-02 11:32:53')
Wenn Sie Aufzeichnungen zwischen Tagen wünschen,
select count(col_Name) from dataset where cast(julianday("now")- julianday(_Last_updated) as int)<=0;
In meinem Fall muss ich die Differenz in Minuten berechnen und julianday()
gebe keinen genauen Wert an. Stattdessen benutze ich strftime()
:
SELECT (strftime('%s', [UserEnd]) - strftime('%s', [UserStart])) / 60
Beide Daten werden in Unixtime (Sekunden) konvertiert und dann subtrahiert, um den Wert in Sekunden zwischen den beiden Daten zu erhalten. Teilen Sie es als nächstes durch 60.