Extension de date/heure haute précision
SQLite fournit des fonctions de date de base, mais comme davantage de fonctionnalités étaient nécessaires, une extension de date/heure haute précision appelée sqlean-time a été créée. Cette extension propose une API structurée et diverses fonctionnalités.
Remarque. Ajouter une extension à SQLite est très simple. Il suffit de télécharger le fichier et d’exécuter une seule commande de base de données.
Concepts
Cette extension utilise deux types de valeurs : le temps (Time) et la durée (Duration).
-
Temps (Time) : une paire composée de secondes et de nanosecondes, représentant les secondes écoulées depuis l’instant zéro (0001-01-01 00:00:00 UTC) ainsi que les nanosecondes à l’intérieur de la seconde courante.
- Il est possible de stocker le temps dans cette représentation interne, ce qui permet de représenter des dates situées à plusieurs milliards d’années dans le passé ou le futur avec une précision à la nanoseconde.
- Le temps peut aussi être stocké comme des secondes depuis l’époque Unix (1970-01-01 00:00:00 UTC), en millisecondes, microsecondes ou nanosecondes.
- Le temps est toujours stocké et manipulé en UTC, mais peut être converti avec un décalage de fuseau horaire spécifique.
-
Durée (Duration) : un entier 64 bits en nanosecondes, capable de représenter des valeurs allant jusqu’à environ 290 ans.
Création de valeurs temporelles
-
Heure actuelle :
select time_fmt_iso(time_now()); -- 2024-08-06T21:22:15.431295000Z -
Date/heure spécifique :
select time_fmt_iso(time_date(2011, 11, 18)); -- 2011-11-18T00:00:00Z select time_fmt_iso(time_date(2011, 11, 18, 15, 56, 35)); -- 2011-11-18T15:56:35Z
Extraction de champs temporels
Il existe des fonctions pour extraire divers champs de date/heure :
select 'year = ' || time_get_year(time_now());
select 'month = ' || time_get_month(time_now());
select 'day = ' || time_get_day(time_now());
Temps Unix
Fonctions pour créer des valeurs temporelles à partir du temps Unix (temps écoulé depuis 1970-01-01 UTC) :
select time_fmt_iso(time_unix(1321631795)); -- 2011-11-18T15:56:35Z
Fonctions pour convertir une valeur temporelle en temps Unix :
select time_to_unix(time_now()); -- 1722979335
Comparaison temporelle
Fonctions pour comparer des valeurs temporelles :
select time_after(time_now(), time_date(2011, 11, 18)); -- 1
select time_before(time_now(), time_date(2011, 11, 18)); -- 0
Calculs temporels
Fonctions pour ajouter une durée à une valeur temporelle :
select time_fmt_iso(time_add(time_now(), 24*dur_h())); -- 2024-08-07T21:22:15.431295000Z
Constantes de durée :
dur_us()- 1 microsecondedur_ms()- 1 millisecondedur_s()- 1 secondedur_m()- 1 minutedur_h()- 1 heure
Arrondi
Fonctions pour arrondir des valeurs temporelles à la précision du champ spécifié :
select 'original = ' || time_fmt_iso(t.v) from t union all
select 'millennium = ' || time_fmt_iso(time_trunc(t.v, 'millennium')) from t;
Formatage
Fonctions qui renvoient des chaînes temporelles au format ISO 8601 :
select time_fmt_iso(time_date(2011, 11, 18, 15, 56, 35, 666777888), 3*3600); -- 2011-11-18T18:56:35.666777888+03:00
Constantes de durée
Fonctions qui renvoient des durées courantes en nanosecondes :
select dur_ns(); -- 1
select dur_us(); -- 1000
Remerciements
Cette extension est implémentée en C, et sa conception comme son implémentation s’appuient sur le package time de la bibliothèque standard de Go (licence BSD 3-Clause).
Installation et utilisation
- Télécharger la dernière version
- Utilisation dans l’interface en ligne de commande SQLite :
sqlite> .load ./time sqlite> select time_now();
Récapitulatif GN⁺
- L’extension
sqlean-timeajoute à SQLite des fonctionnalités de date/heure haute précision permettant diverses opérations temporelles. - Le temps et les durées peuvent être traités à la nanoseconde, ce qui permet des calculs temporels extrêmement précis.
- Elle fournit diverses fonctions de formatage et de comparaison du temps, faciles à utiliser pour les développeurs.
- Elle offre bien plus de possibilités que les fonctions de date de base de SQLite, ce qui la rend utile pour les projets nécessitant des opérations temporelles complexes.
1 commentaires
Commentaires sur Hacker News
Question sur le fait de savoir si cela gère les cas particuliers des changements de fuseau horaire et des discontinuités de l’heure locale documentés par Jon Skeet
Il vaut mieux ne pas développer soi-même des bibliothèques de date/heure et de chiffrement
Les trois différentes représentations/échelles du temps sont intéressantes
Il est important de préciser si des entiers signés sont utilisés ou non
Il serait bien que SQLite3 dispose d’un système de types extensible
C’est jugé très cool, tout en soulignant une fonctionnalité importante manquante dans SQLite
Il est soutenu que la base de données devrait suivre les unités
float64"2h"en 7200.0 secondes et comparer cela lors d’un parcours complet de tableQuestion sur ce qui est le plus utile entre la représentation en nanosecondes et les années en dehors de cette plage en nanosecondes
Proposition d’utiliser un timestamp Unix à la manière de Golang, en nanosecondes, avec un
int64signéIl est affirmé qu’il ne faut pas utiliser l’expression « secondes depuis l’epoch » à moins de vouloir exactement dire cela
select time_sub(time_date(2011, 11, 19), time_date(1311, 11, 18));