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.
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
DateCreated
in UTC sind. Wenn es stattdessen Ortszeit ist, müssen Siejulianday('now')
in Ortszeit konvertieren . Ich konnte nirgendwo diese Informationen finden. Wenn Ihnenjulianday('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 UTCjulianday('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
Unterschied in Stunden
Unterschied in Minuten
Unterschied in Sekunden
quelle
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.Die Differenz beträgt 34 Tage. Wir können
julianday('now')
für eine bessere Klarheit verwenden. Mit anderen Worten, wir müssen nichtdate()
oderdatetime()
Funktionen als Parameter setzen, um zujulianday()
funktionieren.quelle
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:
quelle
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:
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 diesjulianday('now')
gegen ein GMT-Datum verstößt: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 - StundenWie mir bereits mitgeteilt wurde, stimmen beide Daten, die in der Ortszeit gespeichert sind, mit der Ortszeit überein:
Oder
'Z'
an die Ortszeit anhängen :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.
quelle
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
quelle
Wenn Sie Zeit im 00:00-Format haben möchten: Ich habe es so gelöst:
quelle
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))
quelle
Erstens ist nicht klar, wie Ihr Datumsformat lautet. Es gibt bereits eine Antwort mit
strftime("%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:
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:
Datumsunterschied in Stunden:
Datumsunterschied in Minuten:
Datumsunterschied in Sekunden:
quelle
Wenn Sie einen Unterschied in Sekunden wollen
quelle
Wenn Sie Aufzeichnungen zwischen Tagen wünschen,
quelle
In meinem Fall muss ich die Differenz in Minuten berechnen und
julianday()
gebe keinen genauen Wert an. Stattdessen benutze ichstrftime()
: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.
https://www.sqlite.org/cvstrac/wiki?p=DateAndTimeFunctions
quelle