Aller au contenu

Manipulation de dates

Les fonctions SQL date, time et datetime permettent de convertir explicitement une chaîne de caractère en DATE, TIME ou DATETIME respectivement (ou convertir les formats de date entre eux). À l'insertion des données, des conversions implicitent s'opèrent.

erDiagram  
etudiants {
        NUMERIC(8) code PK
        VARCHAR(255) nom
        YEAR annee_admission
        DATETIME date_naissance
        VARCHAR(10) programme
     } 
INSERT INTO etudiants (code, nom, annee_admission, 
    date_naissance, programme) VALUES
    (1234567, 'Tony Stark', 2019, date('1970-05-29'), '420.A0'),
    (2345678, 'Steve Rogers' 2019, date('1918-07-04'), '420.A0');

Extraire des informations de la date/temps

On peut avoir besoin d’extraire certains éléments des types DATE, TIME ou DATETIME.

Une fonction existe pour chaque type. La fonction extract permet d’extraire plusieurs informations à la fois.

https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_extract

Exemple : vendredi 2021-02-05 11:04:19

Fonction Retourne Valeur
year l'année 2021
month le numéro du mois 2
day / dayofmonth le numéro du jour dans le mois 5
hour l'heure 11
minute le nombre de minute 4
second le nombre de secondes 19

Exemple : vendredi 2021-02-05 11:04:19

Fonction Retourne Valeur
dayofweek le numéro du jour de la semaine (0 = dimanche) 5
dayname le nom du jour (anglais) Friday
monthname le nom du mois (anglais) February
dayofyear le numéro du jour dans l'année 36
weekofyear le numéro de la semaine dans l'année 5
week le numéro de la semaine 5

Date et heure actuelle

On utilise les fonctions suivantes pour obtenir la date et l’heure actuelle.

Fonction Type de retour
now DATETIME
current_date DATE
current_time TIME
current_timestamp TIMESTAMP

Différences de temps

Pour considérer la différence entre 2 temps (TIME ou DATETIME), on utilise la fonction timediff.

Le résultat de timediff est exprimé en termes de TIME. Si un type DATETIME est utilisé, la partie de la date est ignorée.

Les deux arguments doivent être du même type.

Exemple de timediff

Par exemple, chaque periode du cours possède un temps de début et de fin et on souhaite connaître la longueur des périodes.

SELECT periode_id, heure_debut, heure_fin, 
       timediff(heure_fin, heure_debut) 
    FROM periodes; 
periode_id heure_debut heure_fin timediff(heure_fin, heure_debut)
1 09:15:00 11:05:00 01:50:00
2 08:15:00 12:05:00 03:50:00
3 15:15:00 16:05:00 00:50:00
erDiagram  
    periodes {
        int periode_id PK
        time heure_debut
        time heure_fin
    }

Différence de dates

De même façon la fonction datediff permet de calculer la différence entre deux dates.

Le résultat de datediff est exprimé en termes de nombre de jours. Si un type DATETIME est utilisé, la partie du temps est ignorée.

Les deux arguments doivent être du même type.

Exemple de différence de dates

Par exemple, on peut exprimer la longueur d'une session en terme de jours, mais cela n'est pas toujours parlant.

SELECT session_code, session_saison, datediff(date_fin, date_debut) as nombre_jours 
    FROM sessions;
session_code session_saison nombre_jours
A20 Automne 125
A21 Automne 125
H21 Hiver 125

Construire une date à partir d'un nombre de jour

La fonction from_days permet de construire la date à partir d'un nombre de jours.

Toutefois, cette fonction ne devrait pas être utilisée si le résultat est hors des limites habituels des dates.

SELECT from_days(739342); # Retourne 2024-04-01

L'opération inverse est possible avec la fonction to_days.

SELECT to_days('2024-04-01'); # Retourne 739342

Différence de DATETIME ?

Il n’y a pas de fonction qui retourne l’addition ou différence de DATETIME. La partie de date et du temps doivent être traités séparément.

Addition de temps

Pour ajouter du temps à un type TIME on utilise la fonction addtime.

Cette fonction ajoute deux types time ensemble.

SELECT addtime ('00:02:15', '00:03:18') 
-- retourne 0 h 5 m 33 s

Addition de date

La fonction adddate ajoute un intervalle à un type DATE ou à un type DATETIME. On inscrit un intervalle avec la syntaxe suivante.

INTERVAL nombre UNITE

Les unités possibles sont YEAR, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND https://dev.mysql.com/doc/refman/8.0/en/expressions.html#temporal-intervals

Pour ajouter une journée à la date du 15 janvier 2022.

adddate ('2022-01-15', INTERVAL 1 DAY) 
-- retourne 2022-01-16

Soustraction de date

Pour soustraire un intervalle à un type DATE ou DATETIME, on peut utiliser la fonction subdate.

Cette fonction s’utilise exactement comme adddate.

--- Exercice 2.4.1 ---

Utiliser ecole2.sql pour répondre aux questions suivantes.

On veut le titre des documents des évaluations des étudiants qui :
A. ont été remis au mois de mai
B. ont été remis dans les deux dernières années

On veut la saison et le code de session des sessions qui :
C. Durent plus de 17 semaines

Manipulation de timestamp

Deux fonctions permettent la manipulation des timestamps:

  • timestampadd
  • timestampdiff

Les fonctions addition ou soustraient 2 timestamp et retournent la valeur sous forme de l’unité indiquée.

Obtenir l’addition de 3 minutes à l’heure actuelle :

timestampadd (MINUTE, 3, current_timestamp())

Obtenir le nombre de jours avant Noël.

timestampdiff (DAY, '2022-12-25', current_timestamp ())

Gestion des fuseaux horaires

MySQL offre plusieurs fonctions pour gérer des informations de différents fuseaux horaires.

Toutes les fonctions de manipulation du temps sont décrites ici:

https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html