Retour à la liste des articles Articles
22 minutes de lecture

Fonctions SQL de date et d'heure dans 5 dialectes SQL populaires

Êtes-vous confus par toutes les fonctions de date et d'heure utilisées dans les différents dialectes SQL ? Dans cet article, je résume les types de données date et heure utilisés dans PostgreSQL, Oracle, SQLite, MySQL et T-SQL. Je fournis également des exemples des principales fonctions SQL de date et d'heure utilisées dans ces dialectes. Il est temps de devenir des gourous de la date et de l'heure !

Voulez-vous calculer la fréquence à laquelle les employés arrivent en retard au travail? Ou combien de temps il faut pour terminer une commande ? Dans de nombreux cas, les analystes de données doivent effectuer des calculs sur des valeurs liées à la date et à l'heure dans SQL. Cependant, les types de données et les fonctions de date et d'heure diffèrent considérablement selon les dialectes SQL. Les requêtes auront un aspect très différent selon que vous les écrivez, par exemple, dans PostgreSQL ou dans SQL Server.

Dans cet article, j'aborde les bases du traitement des dates et des heures dans différents dialectes SQL. Je fournis également des exemples de fonctions clés de date et d'heure.

Si vous souhaitez passer à une partie spécifique, voici les dialectes SQL couverts dans cet article :

Vous pouvez également commencer à apprendre les types de données de date et d'heure dès aujourd'hui avec le cours Data Types in SQL. Ce cours interactif couvre les types de données qui fonctionnent dans tous les systèmes de gestion de bases de données relationnelles courants, notamment SQL Server, MySQL, Oracle et PostgreSQL.

Fonctions SQL de date et d'heure dans différents dialectes

Il est toujours plus facile d'obtenir de nouvelles informations par le biais de cas d'utilisation concrets. Pour comprendre comment les dates et les heures peuvent être traitées dans différents dialectes SQL, je vous propose d'utiliser le tableau suivant qui présente des voyages prévus en 2022. Ici, nous avons à la fois des dates et des horodatages avec un décalage de fuseau horaire.

trips
idDestinationdeparture_datereturn_datedeparture_timestamparrival_timestamp
1San Francisco2022-03-212022-03-262022-03-21 08:00 -04:002022-03-21 11:14 -07:00
2London2022-06-032022-06-102022-06-03 19:00 -04:002022-06-04 07:10 +01:00
3Sydney2022-07-282022-08-102022-07-28 15:00 -04:002022-07-30 06:55 +10:00

Voyons maintenant comment nous pouvons traiter ces données dans différents dialectes SQL.

Fonctions de date et d'heure de PostgreSQL

Il existe quatre types de données qui traitent les dates et les heures dans PostgreSQL :

  • Le type de données date est utilisé pour stocker des dates sans l'heure exacte (par exemple, '2022-21-03').
  • Le type de données time permet de stocker l'heure sans date (par exemple, '8:34:59'). Par défaut, le type de données time ne contient pas d'informations sur le fuseau horaire. Si vous avez besoin de spécifier le fuseau horaire, vous devrez utiliser use time with time zone. Toutefois, il est recommandé d'utiliser le type de données suivant lorsqu'il s'agit de fuseaux horaires.
  • Le type de données timestamp est très utile dans la pratique, car il permet de stocker l'horodatage complet - les dates avec l'heure exacte (par exemple, '2022-07-30 06:55:34'). La précision peut aller jusqu'à 1 microseconde. Comme pour le type de données time, si vous souhaitez inclure des informations sur le fuseau horaire, vous devrez utiliser timestamp avec le fuseau horaire.
  • Le type de données interval est utilisé pour stocker des informations sur les intervalles de temps (c'est-à-dire la durée). Vous pouvez restreindre l'ensemble des champs stockés en ajoutant une phrase correspondante (par exemple YEAR, DAY, YEAR TO MONTH, HOUR TO SECOND) ; vous pouvez obtenir plus de détails dans la documentation de PostgreSQL. Ces intervalles peuvent être ajoutés ou soustraits aux types de données définis ci-dessus.

Vous pouvez en savoir plus sur ces types de données et d'autres types de données PostgreSQL dans cet article; passons à un cas d'utilisation pratique.

Pour créer notre table trips dans PostgreSQL, nous utilisons le code suivant :

CREATE TABLE trips(
    id int,
    destination varchar(32),
    departure_date date,
    return_date date,
    departure_timestamp timestamp with time zone,
    arrival_timestamp timestamp with time zone
);

INSERT INTO trips
VALUES (1, 'San Francisco', '2022-03-21', '2022-03-26', '2022-03-21 8:00 -04:00', '2022-03-21 11:14 -07:00');

INSERT INTO trips
VALUES (2, 'London', '2022-06-03', '2022-06-10', '2022-06-03 19:00 -04:00', '2022-06-04 07:10 +01:00');

INSERT INTO trips
VALUES (3, 'Sydney', '2022-07-28', '2022-08-10', '2022-07-28 15:00 -04:00', '2022-07-30 06:55 +10:00');

Notez que nous utilisons le type de données date pour stocker des informations sur les dates de départ et de retour. Nous utilisons également timestamp avec le fuseau horaire pour stocker les heures de départ et d'arrivée. Ce type de données nous permet de stocker des informations sur la date, l'heure et le fuseau horaire ; comme tous nos voyages traversent plusieurs fuseaux horaires, c'est important.

Pour mettre en pratique les fonctions de date et d'heure de PostgreSQL, disons que nous voulons savoir :

  1. La durée de notre voyage en jours.
  2. La durée de notre vol depuis notre domicile à New York jusqu'à la ville de destination.
  3. La date à laquelle nous devons commencer à préparer le voyage, que nous pouvons imaginer être d'environ 14 jours.

Nous voulons obtenir ces informations pour chaque voyage de notre tableau. Voici comment la trouver en utilisant PostgreSQL :

SELECT 
  destination, 
  return_date - departure_date + 1 AS trip_duration, 
  arrival_timestamp - departure_timestamp AS flight_duration,
  departure_date - INTERVAL '14 DAYS' AS prep_date
FROM trips;

Notez que nous avons ajouté +1 pour inclure les jours de départ et d'arrivée à la durée de notre voyage. Voici les résultats :

Destinationtrip_durationflight_durationprep_date
San Francisco60 years 0 mons 0 days 6 hours 14 mins 0.00 secs2022-03-07T00:00:00Z
London80 years 0 mons 0 days 7 hours 10 mins 0.00 secs2022-05-20T00:00:00Z
Sydney140 years 0 mons 1 days 1 hours 55 mins 0.00 secs2022-07-14T00:00:00Z

Il y a beaucoup d'autres choses que vous pouvez faire avec la date et l'heure dans PostgreSQL. Dans le tableau suivant, j'ai résumé comment faire :

data typedateflight_durationprep_date
timetimestamp0 years 0 mons 0 days 6 hours 14 mins 0.00 secs2022-03-07T00:00:00Z
PurposeTo store datesTo store timesTo store dates and times
FormatYYYY-MM-DDHH:MM:SSYYYY-MM-DD HH:MM:SS
Time zoneN/Atime with time zonetimestamp with time zone
Getting current day/timeCURRENT_DATECURRENT_TIMECURRENT_TIMESTAMP
Examples
Subtracting dates/times'2022-03-26' - '2022-03-21' –> 5'11:14:00' - '8:00:00' –> 03:14:00'2022-03-21 11:14 -07:00' - '2022-03-21 8:00 -04:00' –> 6 hours 14 mins 0.00 secs
Adding/subtracting intervals'2022-03-21' - INTERVAL '14 DAYS' –> 2022-03-07T00:00:00Z‘08:00:00’ + INTERVAL '3 HOURS 14 MINUTES' –> 11:14:00'2022-03-21 8:00 -04:00' + INTERVAL '6 HOURS 14 MINUTES' –> 2022-03-21T18:14:00Z
Extracting a part of a date/timeEXTRACT(MONTH FROM '2022-03-21') –> 3EXTRACT(HOURS FROM '8:00:00') –> 8EXTRACT(HOURS FROM '2022-03-21 8:00 -04:00') –> 12 (GMT time zone)
Creating a date/time given its partsMAKE_DATE(2022, 3, 21) –> 2022-03-21MAKE_TIME(6, 22, 23) –> 06:22:23MAKE_TIMESTAMP(2022, 3, 21, 6, 22, 23) –> 2022-03-21 06:22:23
Truncating datesDATE_TRUNC('month', DATE'2022-03-21') –> 2022-03-01T00:00:00ZN/ADATE_TRUNC('day', TIMESTAMP'2022-03-21 8:00 -04:00') –> 2022-03-21T00:00:00Z
Converting a string into date/timeTO_DATE('2022/03/21', 'YYYY/MM/DD') –> 2022-03-21N/ATO_TIMESTAMP('2022/03/21, 06.22.23', 'YYYY/MM/DD, HH.MI.SS') –> 2022-03-21T06:22:23Z
Changing a date/time to a string with specific formattingTO_CHAR(date '2022-03-21', 'Month DD, YYYY') –> March 21, 2022TO_CHAR(time '06:22:23', 'HH:MI AM') –> 06:22 AMTO_CHAR(timestamp '2022-03-21 06:22:23', 'Mon DD, YYYY HH:MI AM') –> Mar 21, 2022 06:22 AM

Pour plus de détails sur chacune des fonctions ci-dessus, consultez la documentation de PostgreSQL sur les types de date/heure, les fonctions et opérateurs de date/heure et les fonctions de formatage de date/heure.

Fonctions Oracle de date et d'heure

Voici les types de données permettant de traiter les dates et les heures dans la base de données Oracle :

  • DATE. Ce type de données stocke les informations de date et d'heure, notamment le siècle, l'année, le mois, la date, l'heure, la minute et la seconde. Si un composant horaire n'est pas spécifié, l'heure par défaut est minuit.
  • Le type de données TIMESTAMP est une extension du type de données DATE, car il stocke également les fractions de seconde.
    • TIMESTAMP WITH TIME ZONE est une variante du type de données TIMESTAMP. Il stocke un décalage de fuseau horaire ou un nom de région de fuseau horaire.
    • TIMESTAMP WITH LOCAL TIME ZONE est une autre variante de TIMESTAMP. Au lieu de stocker un décalage de fuseau horaire en tant que partie des données de la colonne, les informations de fuseau horaire sont simplement normalisées au fuseau horaire de la base de données, c'est-à-dire qu'Oracle les renvoie dans le fuseau horaire de la session locale des utilisateurs.
  • Le type de données INTERVAL YEAR TO MONTH stocke une période de temps à l'aide des types de données YEAR et MONTH
  • Le site INTERVAL DAY TO SECOND stocke une période de temps en termes de jours, d'heures, de minutes et de secondes.

Vous pouvez en savoir plus sur les types de données datetime d'Oracle dans la documentation Oracle; nous passons à notre cas d'utilisation pratique. Créons maintenant la table trips dans la base de données Oracle.

CREATE TABLE trips (
    id int,
    destination varchar(32),
    departure_date date,
    return_date date,
    departure_timestamp timestamp with time zone,
    arrival_timestamp timestamp with time zone
);
   
INSERT INTO trips
VALUES (1, 'San Francisco', DATE'2022-03-21', DATE'2022-03-26', TIMESTAMP'2022-03-21 8:00:00 -04:00', TIMESTAMP'2022-03-21 11:14:00 -07:00');

INSERT INTO trips
VALUES (2, 'London', DATE'2022-06-03', DATE'2022-06-10', TIMESTAMP'2022-06-03 19:00:00 -04:00', TIMESTAMP'2022-06-04 07:10:00 +01:00');

INSERT INTO trips
VALUES (3, 'Sydney', DATE'2022-07-28', DATE'2022-08-10', TIMESTAMP'2022-07-28 15:00:00 -04:00', TIMESTAMP'2022-07-30 06:55:00 +10:00');

Comme vous pouvez le constater, nous utilisons le type de données DATE pour nos dates de départ et de retour. (Nous n'avons pas besoin ici d'informations sur le fuseau horaire ni de précision jusqu'à des fractions de seconde). Nous utilisons TIME WITH TIME ZONE pour nos heures de départ et d'arrivée, car nous avons des données sur différents fuseaux horaires.

Notez que lorsque nous insérons des valeurs, nous spécifions le type de données pour chaque valeur. Nous pouvons également utiliser le format par défaut d'Oracle sans spécifier le type de données (par exemple, '21-MAR-2022' et '21-MAR-2022 8.00.00 AM -04.00'). Vous pouvez modifier les formats par défaut à l'aide des paramètres d'initialisation NLS_DATE_FORMAT, NLS_DATE_LANGUAGE et NLS_TIMESTAMP_TZ_FORMAT. Vous trouverez de plus amples informations dans la documentation d'Oracle.

Pour chaque destination, nous voulons à nouveau connaître la durée du voyage en jours (y compris les jours de départ et d'arrivée), la durée du vol vers la ville cible et la date à laquelle nous devons commencer à préparer le voyage, en supposant que nous voulons commencer 14 jours à l'avance.

Voici comment trouver ces informations dans Oracle :

SELECT
  destination, 
  return_date - departure_date + 1 AS trip_duration, 
  arrival_timestamp - departure_timestamp AS flight_duration,
  departure_date - 14 AS prep_date
FROM trips;
Destinationtrip_durationflight_durationprep_date
San Francisco60 6:14:0.02022-03-07T00:00:00Z
London80 7:10:0.02022-05-20T00:00:00Z
Sydney141 1:55:0.02022-07-14T00:00:00Z

Il y a beaucoup d'autres choses que vous pouvez faire avec les dates et les heures dans Oracle. Le tableau suivant résume comment :

  • Obtenir la date actuelle et l'heure actuelle.
  • Soustraire des dates et soustraire des heures.
  • Ajouter/soustraire des intervalles.
  • Extraire certaines parties de la date/heure.
  • Tronquer les dates.
  • Convertir des chaînes de caractères en objets date/heure.
  • Transformer des objets date/heure en chaînes de caractères avec un formatage spécifique.
Data typeDATETIMESTAMP
PurposeTo store dates and timesTo store dates and times (up to fractional seconds) with or without time zone
FormatDD-MON-RRDD-MON-RR HH.MI.SSXFF AM
Time zoneN/Atimestamp with time zone
timestamp with local time zone
Getting current day/timeCURRENT_DATECURRENT_TIMESTAMP
Examples
Subtracting dates/timesDATE'2022-03-26' - DATE'2022-03-21' –> 5TIMESTAMP '2022-03-21 11:14:00 -07:00' - TIMESTAMP '2022-03-21 08:00:00 -04:00' –> 0 6:14:0.0
Adding/subtracting intervalsDATE'2022-03-26' - 14 –> 2022-03-12T00:00:00ZTIMESTAMP'2022-03-21 8:00:00 -04:00' + INTERVAL '0 6:14:00' DAY TO SECOND –> 2022-03-21T18:14:00Z
Extracting a part of a date/timeEXTRACT(MONTH FROM DATE'2022-03-21') –> 3EXTRACT(HOUR FROM TIMESTAMP '2022-03-21 8:00:00 -04:00') –> 12 (GMT time zone)
Truncating datesTRUNC(DATE'2022-03-21', 'MONTH') –> 2022-03-01T00:00:00ZTRUNC(TIMESTAMP'2022-03-21 8:00:00 -04:00', 'DAY') –> 2022-03-20T00:00:00Z
Converting a string into a date/timeTO_DATE('2022/03/21', 'YYYY/MM/DD') –> 2022-03-21T00:00:00ZTO_TIMESTAMP('2022/03/21, 06.22.23', 'YYYY/MM/DD, HH.MI.SS') –> 2022-03-21 06:22:23.0
Changing a date/time to a string with specific formattingTO_CHAR(DATE '2022-03-21', 'Month DD, YYYY') –> March 21, 2022TO_CHAR(TIMESTAMP '2022-03-21 06:22:23', 'Mon DD, YYYY HH:MI AM') –> Mar 21, 2022 06:22 AM

Pour plus de détails sur chacune des fonctions ci-dessus - et sur d'autres fonctions de date et d'heure utiles dans Oracle - consultez cet article et la documentation d'Oracle.

Fonctions de date et d'heure de SQLite

SQLite ne dispose pas de types de données particuliers pour le stockage des dates et des heures. Cependant, les fonctions de date et d'heure de SQLite peuvent vous aider à stocker les dates et les heures sous forme de valeurs TEXT, REAL, ou INTEGER:

  • TEXT comme des chaînes de caractères ISO 8601 ('YYYY-MM-DD HH:MM:SS.SSS').
  • REAL comme le nombre de jours depuis midi à Greenwich le 24 novembre 4714 avant J.-C.
  • INTEGER comme le nombre de secondes depuis 1970-01-01 00:00:00 UTC.

Voici les fonctions de date et d'heure de SQLite :

  • La fonction date() renvoie la date au format AAAA-MM-JJ.
  • La fonction time() renvoie l'heure au format HH:MM:SS.
  • La fonction datetime() renvoie l'horodatage au format AAAA-MM-JJ HH:MM:SS.
  • La fonction julianday() renvoie le jour julien, c'est-à-dire le nombre de jours écoulés depuis midi à Greenwich, en Angleterre, le 24 novembre 4714 avant Jésus-Christ.
  • La fonction strftime() renvoie la date formatée selon la chaîne de format spécifiée en premier argument.

Pour créer notre tableau de voyages en SQLite, nous pouvons utiliser le code suivant :

CREATE TABLE trips (
    id int,
    destination text,
    departure_date text,
    return_date text,
    departure_timestamp text,
    arrival_timestamp text
);

INSERT INTO trips
VALUES (1, 'San Francisco', '2022-03-21', '2022-03-26', '2022-03-21 08:00 -04:00', '2022-03-21 11:14 -07:00');

INSERT INTO trips
VALUES (2, 'London', '2022-06-03', '2022-06-10', '2022-06-03 19:00 -04:00', '2022-06-04 07:10 +01:00');

INSERT INTO trips
VALUES (3, 'Sydney', '2022-07-28', '2022-08-10', '2022-07-28 15:00 -04:00', '2022-07-30 06:55 +10:00');

Notez que nous utilisons le type de données TEXT pour stocker toutes nos dates et heures. Ensuite, nous insérons des valeurs en spécifiant les dates et les heures dans le format habituel, en incluant même les fuseaux horaires si nécessaire.

Nous voulons maintenant mettre en pratique les fonctions de date et d'heure de SQLite en calculant la durée de notre voyage en jours (y compris les jours de départ et d'arrivée), la durée du vol en heures, et la date à laquelle nous devons commencer à préparer le voyage, qui est habituellement de 14 jours.

Voici comment calculer ces données en SQLite :

SELECT
  destination,
  julianday(return_date) - julianday(departure_date) + 1 AS trip_duration,
  (julianday(arrival_timestamp) - julianday(departure_timestamp)) * 24 AS flight_duration,
  date(departure_date, '-14 days') AS prep_date
FROM trips;
Destinationtrip_durationflight_durationprep_date
San Francisco66.233333330601452022-03-07
London87.166666664183142022-05-20
Sydney1425.916666675359012022-07-14

Dans cette requête, nous avons utilisé la fonction julianday() pour calculer la différence entre deux dates/horodatages. Cette fonction renvoie le nombre de jours, ce qui est ce que nous attendons pour la durée du voyage. La durée du vol est mieux présentée en heures - nous multiplions donc le résultat par 24 pour obtenir la durée du vol en heures. Notez également l'élégance de la fonction date() qui nous permet d'ajouter/soustraire des jours à une valeur de date. De même, vous pouvez ajouter/soustraire des années, des mois, des heures, des minutes et des secondes.

Voyons ce que nous pouvons faire d'autre avec les dates et les heures dans SQLite. Dans le tableau suivant, j'ai résumé comment faire :

Contrairement aux tableaux que nous avons pour d'autres dialectes SQL, ici les colonnes ne correspondent pas à des types de données spécifiques. Elles comprennent simplement des exemples de traitement (1) des dates, (2) des heures, et des dates et des heures ensemble (c'est-à-dire des horodatages).

DatesTimesDates and times
FormatYYYY-MM-DDHH:MM:SSYYYY-MM-DD HH:MM:SS
Time zoneN/A[+-] HH:MM[+-] HH:MM
Getting current day/timedate('now')time('now')datetime('now')
Examples
Subtracting dates/timesjulianday('2022-03-26') - julianday('2022-03-21') –> 5time('06:50') - time('04:10') –> 2 (shows number of full hours)(julianday('2022-03-21 11:14 -07:00') - julianday('2022-03-21 08:00 -04:00')) * 24 –> 6.23 hours
Adding/subtracting intervalsdate('2022-03-21', '-14 days') –> 2022-03-07time('08:00', '+3 hours', '+14 minutes') –> 11:14:00datetime('2022-03-21 08:00 -04:00','+6 hours', '+14 minutes') –> 2022-03-21 18:14:00
Extracting a part of a date/timestrftime('%m','2022-03-21') –> 03strftime('%H','08:00:00') –> 08strftime('%H', '2022-03-21 08:00 -04:00') –> 12 (GMT time zone)
Truncating datesdate('2022-03-21', 'start of month') –> 2022-03-01N/Adatetime('2022-03-21 08:00 -04:00', 'start of day') –> 2022-03-21 00:00:00
Changing the formattingstrftime('%m/%d/%Y', '2022-03-21') –> 03/21/2022strftime('%H.%M', '06:22:23') –> 06.22strftime('%d.%m.%Y %H.%M', '2022-03-21 06:22:23') –> 21.03.2022 06.22

Pour plus de détails sur les fonctions date et heure de SQLite, consultez la documentation de SQLite.

Fonctions MySQL de date et d'heure

Il existe cinq types de données pour traiter les dates et les heures dans MySQL :

  • Le type de données DATE est utilisé pour les valeurs comportant une partie date mais pas de partie heure.
  • Le type de données DATETIME est utilisé pour les valeurs qui contiennent à la fois une partie date et une partie heure. Vous pouvez également avoir des secondes fractionnées en insérant les valeurs DATETIME dans le tableau. The supported range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'.
  • Le type de données TIMESTAMP est également utilisé pour les valeurs qui contiennent à la fois des parties de date et d'heure. Il prend également en charge les secondes fractionnées. En outre, à partir de MySQL 8.0.19, ce type de données offre une prise en charge complète des informations relatives aux fuseaux horaires. La plage prise en charge va de '1970-01-01 00:00:01' UTC à '2038-01-19 03:14:07' UTC.
  • Le type de données TIME est utilisé pour représenter l'heure de la journée ainsi que le temps écoulé ou l'intervalle de temps entre deux événements. Les valeurs de TIME peuvent aller de '-838:59:59' à '838:59:59'. Les fractions de seconde sont prises en charge.
  • Le type de données YEAR est utilisé pour représenter les valeurs de l'année. La plage prise en charge est de 1901 à 2155. Notez également que YEAR accepte des valeurs dans une variété de formats, par exemple '2021', 2021, '21', 21.

Vous pouvez en savoir plus sur les types de données et d'heure dans MySQL ici.

Répétons maintenant notre exemple avec des voyages, mais cette fois dans MySQL. Nous commençons par créer la trips table :

CREATE TABLE trips (
    id int,
    destination varchar(32),
    departure_date date,
    return_date date,
    departure_timestamp timestamp,
    arrival_timestamp timestamp
);

INSERT INTO trips
VALUES (1, 'San Francisco', '2022-03-21', '2022-03-26', '2022-03-21 08:00:00-04:00', '2022-03-21 11:14:00-07:00');

INSERT INTO trips
VALUES (2, 'London', '2022-06-03', '2022-06-10', '2022-06-03 19:00:00-04:00', '2022-06-04 07:10:00+01:00');

INSERT INTO trips
VALUES (3, 'Sydney', '2022-07-28', '2022-08-10', '2022-07-28 15:00:00-04:00', '2022-07-30 06:55:00+10:00');

Comme vous pouvez le voir, nous utilisons le type de données DATE pour stocker les dates de départ et de retour. Pour les heures de départ et d'arrivée, nous avons choisi le type de données TIMESTAMP, car nous voulons conserver les informations sur le fuseau horaire.

Pour calculer la durée du voyage (y compris les jours de départ et d'arrivée), la durée du vol et la date de début de la préparation (14 jours à l'avance), nous pouvons utiliser la requête MySQL suivante :

SELECT
    destination, 
    DATEDIFF(return_date, departure_date) + 1 AS trip_duration, 
    TIMEDIFF(arrival_timestamp, departure_timestamp) AS flight_duration,
    DATE_SUB(departure_timestamp, INTERVAL 14 DAY) AS prep_date
FROM trips;
Destinationtrip_durationflight_durationprep_date
San Francisco606:14:002022-03-07T12:00:00Z
London807:10:002022-05-20T23:00:00Z
Sydney1425:55:002022-07-14T19:00:00Z

Comme vous pouvez le voir dans cette requête, il existe des fonctions MySQL très utiles qui traitent les dates et les heures. En fait, ces fonctions sont nombreuses. Pour avoir un aperçu de ce que vous pouvez faire avec les dates et les heures dans MySQL, consultez le tableau suivant et apprenez à :

Data typeDATETIMEDATETIME/TIMESTAMP
PurposeTo store datesTo store timesTo store dates and times
FormatYYYY-MM-DDHH:MM:SSYYYY-MM-DD HH:MM:SS
Getting the current day/timeCURDATE(), CURRENT_DATE(), CURENT_DATECURTIME(), CURRENT_TIME(), CURENT_TIMENOW(),
CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP
Examples
Subtracting dates/timesDATEDIFF('2022-03-26’, '2022-03-21') –> 5TIMEDIFF('11:14:00', '8:00:00') –> 03:14:00TIMEDIFF('2022-03-21 11:14:00-07:00', '2022-03-21 08:00:00-04:00') –> 06:14:00
Adding/subtracting intervalsDATE_SUB('2022-03-21', INTERVAL 14 DAY) –> 2022-03-07ADDTIME('08:00:00', '03:14:00') –> 11:14:00ADDTIME('2022-03-21 08:00:00-04:00', '06:14') –> 2022-03-21 18:14:00
Extracting a part of a date/timeEXTRACT(MONTH FROM '2022-03-21') –> 3EXTRACT(HOUR FROM '08:00:00') –> 8EXTRACT(HOUR FROM '2022-03-21 08:00:00-04:00') –> 12 (GMT time zone)
Creating a date/time given its partsMAKEDATE(2022, 80) –> 2022-03-21T00:00:00.000ZMAKETIME(6, 22, 23) –> 06:22:23N/A
Converting a string into a date/timeSTR_TO_DATE('2022/03/21', '%Y/%m/%d') –> 2022-03-21T00:00:00.000ZN/ASTR_TO_DATE('2022/03/21, 06.22.23', '%Y/%m/%d, %h.%i.%s') –> 2022-03-21T06:22:23.000Z
Changing the formatting of date/time objectsDATE_FORMAT('2022-03-21', '%M %d, %Y') –> March 21, 2022TIME_FORMAT('06:22:23', '%h:%i %p') –> 06:22 AMDATE_FORMAT('2022-03-21 06:22:23', '%M %d, %Y %h:%i %p') –> Mar 21, 2022 06:22 AM

Pour plus de détails sur chacune des fonctions ci-dessus, consultez la documentation de MySQL sur les fonctions de date et d'heure.

Fonctions T-SQL de date et d'heure

Enfin, nous allons aborder les fonctions de date et d'heure que vous devez connaître si vous travaillez sur MS SQL Server et utilisez Transact-SQL (T-SQL).

Tout d'abord, voici les types de données de date et d'heure pris en charge par T-SQL :

  • Le type de données time est utilisé pour stocker des valeurs de temps, y compris des fractions de seconde.
  • Le type de données date est utilisé pour stocker des valeurs de date sans partie de temps.
  • Le type de données smalldatetime est utilisé dans T-SQL pour stocker des dates et des heures comprises entre 1900-01-01 et 2079-06-06, avec une précision allant jusqu'à une minute.
  • Le type de données datetime peut stocker des dates et des heures comprises entre 1753-01-01 et 9999-12-31, avec une précision allant jusqu'à 0,00333 seconde.
  • T-SQL dispose également du type de données datetime2 . Il stocke des valeurs dans une plage encore plus large (0001-01-01 00:00:00.0000000 à 9999-12-31 23:59:59.9999999) et définit des fractions de seconde jusqu'à 100 nanosecondes.
  • Enfin, le type de données datetimeoffset stocke les dates et les heures avec le décalage du fuseau horaire. Il possède la même plage et la même précision que le type de données datetime2.

Vous pouvez en savoir plus sur les types de données de date et d'heure dans Transact-SQL ici.

Et maintenant, il est temps de répéter notre exemple de voyage avec T-SQL. Comme d'habitude, nous commençons par créer la table trips table :

CREATE TABLE trips (
    id int,
    destination varchar(32),
    departure_date date,
    return_date date,
    departure_timestamp datetimeoffset,
    arrival_timestamp datetimeoffset
);

INSERT INTO trips
VALUES (1, 'San Francisco', '2022-03-21', '2022-03-26', '2022-03-21 08:00 -04:00', '2022-03-21 11:14 -07:00');

INSERT INTO trips
VALUES (2, 'London', '2022-06-03', '2022-06-10', '2022-06-03 19:00 -04:00', '2022-06-04 07:10 +01:00');

INSERT INTO trips
VALUES (3, 'Sydney', '2022-07-28', '2022-08-10', '2022-07-28 15:00 -04:00', '2022-07-30 06:55 +10:00');

Notez que nous utilisons (1) le type de données date pour stocker les dates de départ et de retour, et (2) le type de données datetimeoffset pour stocker les heures de départ et d'arrivée (afin de préserver les informations relatives au fuseau horaire).

Calculons maintenant la durée du voyage (y compris les jours de départ et d'arrivée), la durée du vol et la date de début de la préparation (14 jours à l'avance) à l'aide de T-SQL :

SELECT
    destination, 
    DATEDIFF(day, departure_date, return_date) + 1 AS trip_duration, 
    DATEDIFF(hour, departure_timestamp, arrival_timestamp) AS flight_duration,
    DATEADD(day, -14, departure_timestamp) AS prep_date
FROM trips;
Destinationtrip_durationflight_durationprep_date
San Francisco662022-03-07 08:00:00.0000000 -04:00
London872022-05-20 19:00:00.0000000 -04:00
Sydney14252022-07-14 15:00:00.0000000 -04:00

Comme vous pouvez le constater dans cet exemple, T-SQL dispose de la fonction DATEDIFF() qui traite non seulement les dates mais aussi les valeurs de temps et de date. Cependant, lors du calcul de la durée du vol, nous n'avons pu obtenir que le nombre entier d'heures au lieu de l'intervalle exact avec les minutes. Si vous avez besoin d'informations plus précises, vous pouvez toujours sélectionner une autre partie de date pour cette fonction (par exemple, minute pour obtenir la durée du vol en minutes). Lisez cet article pour voir comment vous pouvez traiter la sortie de cette fonction pour obtenir l'intervalle dans le format requis.

Le tableau suivant résume d'autres opérations que vous pouvez effectuer avec les dates et les heures en T-SQL :

Data typedatetimesmalldatetime/datetime/ datetime2/datetimeoffset
PurposeTo store datesTo store timesTo store dates and times
FormatYYYY-MM-DDHH:MM:SSYYYY-MM-DD HH:MM:SS
Time zoneN/AN/Adatetimeoffset: [+-] HH:MM
Getting the current day/timeCAST(GETDATE() AS date)CAST(GETDATE() AS time)GETDATE(), CURRENT_TIMESTAMP
Examples
Subtracting dates/timesDATEDIFF(day, '2022-03-21', '2022-03-26') –> 5DATEDIFF(hour, '08:00:00', '11:00:00') –> 3DATEDIFF(hour, '2022-03-21 08:00:00-04:00', '2022-03-21 11:00:00-07:00') –> 6
Adding/subtracting intervalsDATEADD(day, -14, '2022-03-21') –> 2022-03-07T00:00:00.000ZN/ADATEADD(hour, 6, '2022-03-21 06:22:23') –> 2022-03-21T12:22:23Z
Extracting part of a date/timeDATEPART(month, '2022-03-21') –> 3DATEPART(hour, '08:00:00') –> 8DATEPART(hour, '2022-03-21 08:00:00 -04:00') –> 8
Creating a date/time given its partsDATEFROMPARTS(2022, 3, 21) –> 2022-03-21TIMEFROMPARTS(6, 22, 23, 0, 0) –> 06:22:23DATETIMEOFFSETFROMPARTS (2022, 3, 21, 6, 22, 23, 0, 4, 0, 0) –> 2022-03-21 06:22:23 +04:00
DATE_FORMAT('2022-03-21', '%M %d, %Y') –> March 21, 2022TIME_FORMAT('06:22:23', '%h:%i %p') –> 06:22 AMDATE_FORMAT('2022-03-21 06:22:23', '%M %d, %Y %h:%i %p') –> Mar 21, 2022 06:22 AM
Converting a string into a date/timeCONVERT(date, '2022/03/21') –> 2022-03-21CONVERT(time, '06:23 AM') –> 06:23:00.0000000CONVERT(datetime, '2022/03/21 06:22:23') –> 2022-03-21T06:22:23Z
Changing the date and time formatFORMAT(GETDATE(), 'MMMM d, yyyy') –> October 1, 2021FORMAT(GETDATE(), 'hh:mm tt') –> 12:23 PMFORMAT(GETDATE(), 'MMMM d, yyyy hh:mm tt') –> October 1, 2021 12:23 PM

Comme vous pouvez le voir dans cet exemple, T-SQL dispose de la fonction DATEDIFF() qui traite non seulement les dates mais aussi les valeurs de temps et de date. Cependant, lors du calcul de la durée du vol, nous n'avons pu obtenir que le nombre entier d'heures au lieu de l'intervalle exact avec les minutes. Si vous avez besoin d'informations plus précises, vous pouvez toujours sélectionner une autre partie de date pour cette fonction (par exemple, minute pour obtenir la durée du vol en minutes). Lisez cet article pour voir comment vous pouvez traiter la sortie de cette fonction pour obtenir l'intervalle dans le format requis.

Le tableau suivant résume d'autres opérations que vous pouvez effectuer avec les dates et les heures en T-SQL :

Pour plus de détails sur les fonctions de date et d'heure du serveur SQL, consultez la documentation T-SQL.

Pratiquons les fonctions de date et d'heure SQL !

J'espère que cet article vous a permis d'acquérir une compréhension générale de la manière dont les dates et les heures peuvent être traitées dans les différents dialectes SQL. Il est maintenant temps de s'exercer !

Je vous recommande de commencer par un cours interactif. Vous pourrez acquérir des connaissances complètes sur les fonctions de données et d'heure SQL, mettre en pratique ces fonctions à l'aide d'exemples concrets et obtenir des conseils lorsque vous êtes bloqué :

  • Fonctions SQL standards comprend 211 défis de codage. Vous vous exercerez aux fonctions SQL standard utilisées pour le traitement des données textuelles, des données numériques, des dates et heures, etc.
  • Data Types in SQL comprend 89 exercices interactifs. Il vous présente les types de données courants dans SQL Server, MySQL, Oracle et PostgreSQL.

Si vous voulez acquérir une connaissance complète de SQL à partir de zéro expérience de programmation, je vous recommande le Le SQL de A à Z parcours d'apprentissage. Il comprend 7 cours interactifs couvrant l'écriture de requêtes simples, la combinaison de données provenant de plusieurs tables, l'écriture de requêtes SQL complexes avec des sous-requêtes, et l'utilisation d'expressions de table courantes, de fonctions de fenêtre, etc.

Merci de votre lecture et bon apprentissage.