web-dev-qa-db-fra.com

Différence entre 2 dates dans SQLite

Comment puis-je obtenir la différence en jours entre 2 dates dans SQLite? J'ai déjà essayé quelque chose comme ça:

SELECT Date('now') - DateCreated FROM Payment

Il retourne 0 à chaque fois.

82
Johan
 SELECT julianday('now') - julianday(DateCreated) FROM Payment;
98
Fred

Différence en jours

Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) As Integer)

Différence en heures

Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) * 24 As Integer)

Différence en minutes

Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 As Integer)

Différence en secondes

Select Cast ((
    JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 * 60 As Integer)
34
Sayka

Les deux réponses apportent des solutions un peu plus complexes, car elles doivent être. Supposons que le paiement a été créé le January 6, 2013..__ Et nous voulons connaître la différence entre cette date et celle d'aujourd'hui.

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

La différence est de 34 jours. Nous pouvons utiliser julianday('now') pour Une meilleure clarté. En d'autres termes, nous n'avons pas besoin de mettre les fonctions date() ou datetime() en tant que paramètres pour la fonction julianday()

31
Jan Bodnar

Le wiki SQLite est une excellente référence et la page DateAndTimeFunctions est idéale pour les signets. Il est également utile de se rappeler qu'il est assez facile de jouer avec des requêtes avec l'utilitaire de ligne de commande sqlite:

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

Cette réponse est un peu longue, et la documentation ne vous l'indiquera pas (car ils supposent que vous stockez vos dates en tant que dates UTC dans la base de données), mais la réponse à cette question dépend en grande partie du fuseau horaire dans lequel vos dates sont stockées. Vous n'utilisez pas non plus Date('now'), mais utilisez la fonction julianday() pour calculer les deux dates par rapport à une date commune, puis soustrayez la différence de ces résultats.

Si vos dates sont stockées en UTC:

SELECT julianday('now') - julianday(DateCreated) FROM Payment;

C’est ce que la réponse la mieux classée a, et se trouve également dans la documentation . Ce n'est qu'une partie de l'image et une réponse très simpliste, si vous me le demandez.

Si vos dates sont stockées à l'heure locale, l'utilisation du code ci-dessus rendra votre réponse FAUX en fonction du nombre d'heures correspondant à votre décalage GMT. Si vous êtes dans l’est des États-Unis comme moi, c’est-à-dire GMT -5, 5 heures seront ajoutées à votre résultat. Et si vous essayez de rendre DateCreated conforme à UTC car julianday('now') va à l’encontre d’une date GMT:

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

Il y a un bogue qui ajoute une heure pour une DateCreated qui correspond à l'heure d'été (mars-novembre). Dites que "maintenant" est à midi un jour non-DST et que vous avez créé quelque chose en juin (pendant l'heure d'été) à midi, votre résultat donnera une heure d'intervalle, au lieu de 0 heure, pour la partie heures. Vous devez écrire une fonction dans le code de votre application qui affiche le résultat pour modifier le résultat et soustraire une heure des dates DST. J'ai fait cela, jusqu'à ce que je réalise qu'il y avait une meilleure solution à ce problème que je rencontrais: SQLite vs Oracle - Calcul des différences de date - heures

Comme cela m’a été signalé, pour les dates stockées à l’heure locale, faites correspondre les deux à l’heure locale:

SELECT julianday('now', 'localtime') - julianday(DateCreated) FROM Payment;

Ou ajoutez 'Z' à l'heure locale:

julianday(datetime('now', 'localtime')||'Z') - julianday(CREATED_DATE||'Z')

Ces deux options semblent compenser et ne pas ajouter l’heure supplémentaire pour les dates DST et effectuer une soustraction directe. Ainsi, un élément créé à midi un jour DST, lorsqu’il vérifie à midi un jour autre que DST, n’aura pas d’heure supplémentaire effectuer le calcul.

Et même si je reconnais que la plupart diront que vous ne stockez pas les dates à l'heure locale dans votre base de données et que vous les stockez au format UTC afin d'éviter de vous heurter à cette situation, toutes les applications ne disposent pas d'un public mondial et tous les programmeurs ne veulent pas effectuer la conversion de TOUTES les dates de leur système en UTC et revenir chaque fois qu’elles effectuent un GET ou un SET dans la base de données et s’emploient à déterminer si quelque chose est local ou en UTC.

4
vapcguy

Si vous voulez du temps au format 00:00: .__, je l'ai résolu comme ça:

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

Premièrement, le format de votre date n’est pas clair… .. Il existe déjà une réponse impliquant strftime("%s").

J'aime développer cette réponse.

SQLite n'a que les classes de stockage suivantes: NULL, INTEGER, REAL, TEXT ou BLOB . Pour simplifier, je supposerai que les dates sont REAL et qu'elles contiennent les secondes depuis le 1970-01-01 . schéma pour lequel je vais mettre dans les exemples de données du "1er décembre 2018":

CREATE TABLE Payment (DateCreated REAL);
INSERT INTO Payment VALUES (strftime("%s", "2018-12-01"));

Voyons maintenant la différence de date entre "1er décembre 2018" et maintenant (au moment où j'écris ceci, il est midi, le 12 décembre 2018):

Date différence en jours:

SELECT (strftime("%s", "now") - DateCreated) / 86400.0 FROM Payment;
-- Output: 11.066875

Date différence en heures:

SELECT (strftime("%s", "now") - DateCreated) / 3600.0 FROM Payment;
-- Output: 265.606388888889

Date différence en minutes:

SELECT (strftime("%s", "now") - DateCreated) / 60.0 FROM Payment;
-- Output: 15936.4833333333

Différence de date en secondes:

SELECT (strftime("%s", "now") - DateCreated) FROM Payment;
-- Output: 956195.0
0
Stephen Quan

Si vous voulez des enregistrements entre les jours,

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

Étant donné que votre format de date suit: "AAAA-MM-JJ HH: MM: SS", Si vous devez trouver la différence entre deux dates en nombre de mois:

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

0
oneinazillion