0Pricing
SQL Interview Prep · Leçon

Calcul arithmétique sur les dates et intervalles

Ajouter ou soustraire des périodes et calculer les écarts entre les dates

Calcul arithmétique sur les dates et intervalles est une leçon SQL Interview Prep gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Interview Prep comprend 4 leçons au total.

Pourquoi le calcul des dates revient en entretien

Le calcul des dates est l'une des compétences SQL les plus pratiques ; les personnes menant les entretiens s'en servent donc beaucoup pour les postes d'analyste et de développement côté serveur. Presque toute question métier comporte une dimension temporelle : les 30 derniers jours, les commandes par semaine, le nombre de jours depuis l'inscription.

La difficulté vient du fait que les fonctions de date sont la partie la moins normalisée du SQL. Une même opération possède une syntaxe différente dans PostgreSQL, MySQL et le serveur SQL. Un bon candidat expose clairement l'idée, puis adapte la syntaxe au dialecte utilisé.

  • Ajouter ou soustraire une période
  • Calculer la différence entre deux dates
  • Travailler avec des valeurs INTERVAL

Le type INTERVAL

Dans PostgreSQL et dans la norme SQL, une période de temps est une valeur à part entière appelée intervalle. Vous l'ajoutez à une date ou à un horodatage avec les opérateurs ordinaires + et -.

C'est la manière la plus claire d'exprimer « il y a 30 jours » ou « dans 3 mois », et les personnes menant les entretiens l'apprécient parce que l'expression se lit naturellement.

SELECT
  CURRENT_DATE,
  CURRENT_DATE + INTERVAL '7 days'   AS next_week,
  CURRENT_DATE - INTERVAL '1 month'  AS last_month,
  NOW() + INTERVAL '90 minutes'      AS soon;

Ajouter des périodes selon les dialectes

Les personnes menant les entretiens demandent souvent : « comment ajouteriez-vous 7 jours dans MySQL par rapport au serveur SQL ? » Connaître les trois principaux dialectes témoigne d'une expérience réelle.

  • PostgreSQL : d + INTERVAL '7 days'
  • MySQL : DATE_ADD(d, INTERVAL 7 DAY)
  • Serveur SQL : DATEADD(day, 7, d)

Le concept est identique ; seule l'écriture change. Indiquez toujours le dialecte pour lequel vous écrivez.

-- MySQL
SELECT DATE_ADD(order_date, INTERVAL 7 DAY) AS due_date FROM orders;

-- SQL Server
SELECT DATEADD(day, 7, order_date) AS due_date FROM orders;

Différence entre deux dates

L'autre aspect du calcul des dates consiste à déterminer l'écart entre deux dates. Le résultat dépend de l'unité et du dialecte.

Dans PostgreSQL, soustraire deux valeurs date donne directement un nombre entier de jours. Soustraire deux valeurs timestamp donne en revanche un intervalle.

-- Postgres: date - date returns an integer (days)
SELECT shipped_date - order_date AS days_to_ship
FROM orders;

DATEDIFF et ses pièges

DATEDIFF existe dans MySQL et le serveur SQL, mais son comportement diffère ; c'est un piège d'entretien apprécié.

  • MySQL : DATEDIFF(end, start) renvoie uniquement un nombre entier de jours.
  • Serveur SQL : DATEDIFF(unit, start, end) prend une unité et compte les franchissements de limites, et non les unités complètes.

Ce comportement lié aux limites est important : DATEDIFF(year, '2023-12-31', '2024-01-01') dans le serveur SQL renvoie 1, alors qu'un seul jour s'est écoulé.

-- SQL Server: counts boundaries, not elapsed time
SELECT DATEDIFF(year, '2023-12-31', '2024-01-01'); -- 1
SELECT DATEDIFF(day,  '2023-12-31', '2024-01-01'); -- 1

Calculer correctement l'âge en années

« Calculer l'âge d'un client en années » est une question classique. Diviser naïvement la différence en jours par 365 produit une dérive à cause des années bissextiles. PostgreSQL possède AGE(), qui renvoie un véritable intervalle calendaire.

Pour obtenir un nombre entier d'années fiable, extrayez la partie correspondant à l'année de l'âge.

-- Postgres
SELECT
  birth_date,
  AGE(CURRENT_DATE, birth_date)               AS exact_age,
  EXTRACT(YEAR FROM AGE(CURRENT_DATE, birth_date)) AS age_years
FROM customers;

Exemple guidé : commandes des 30 derniers jours

Il s'agit d'un filtre d'entretien très courant. La bonne méthode consiste à comparer la colonne de date à un seuil calculé, et non à appliquer une fonction à la colonne.

Comparer order_date à une valeur limite constante permet de continuer à utiliser tout index défini sur order_date. Nous reviendrons plus tard sur ce point concernant les index.

SELECT COUNT(*) AS recent_orders
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '30 days';

Intervalles semi-ouverts pour un mois civil

Lorsque l'on vous demande « toutes les commandes de mars 2024 », évitez BETWEEN '2024-03-01' AND '2024-03-31' sur une colonne d'horodatage. Cette condition exclut les lignes de 23 h le 31 mars et présente un risque d'erreur de décalage d'une unité.

Le schéma fiable est un intervalle semi-ouvert : >= au début et < au début du mois suivant. Il fonctionne quelle que soit la précision de la colonne.

SELECT *
FROM orders
WHERE order_ts >= DATE '2024-03-01'
  AND order_ts <  DATE '2024-04-01';

EXTRACT et les composantes de date

Extraire une seule composante d'une date est une opération courante dans la production de rapports. La fonction standard est EXTRACT(part FROM d), prise en charge par PostgreSQL et MySQL.

  • EXTRACT(YEAR FROM d), MONTH, DAY
  • EXTRACT(DOW FROM d) pour le jour de la semaine
  • Le serveur SQL utilise à la place DATEPART(weekday, d)

Remarque : extraire uniquement MONTH regroupe les mois de mars d'années différentes, ce qui est rarement souhaité.

SELECT
  EXTRACT(YEAR  FROM order_ts) AS yr,
  EXTRACT(MONTH FROM order_ts) AS mo,
  COUNT(*) AS n
FROM orders
GROUP BY 1, 2
ORDER BY 1, 2;

Exemple approfondi : nombre de jours avant le prochain anniversaire

Voici un problème de calcul plus délicat, qui combine extraction et addition. Construisez l'anniversaire de cette année à partir du mois et du jour de naissance et, s'il est déjà passé, reportez-le à l'année suivante.

Expliquer ce raisonnement à voix haute montre à la personne qui mène l'entretien que vous savez traiter des cas limites, comme un anniversaire déjà passé cette année.

-- Postgres
SELECT
  name,
  CASE
    WHEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) >= CURRENT_DATE
    THEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
    ELSE MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int + 1,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
  END AS days_until
FROM customers;

Premier et dernier jour du mois

« Donnez-moi le dernier jour du mois de chaque commande » permet de vérifier si vous utilisez une fonction intégrée ou si vous la réinventez. PostgreSQL combine DATE_TRUNC avec le calcul d'intervalles ; MySQL dispose directement de LAST_DAY().

L'astuce pour obtenir le dernier jour dans PostgreSQL consiste à tronquer la date au début du mois, à ajouter un mois, puis à soustraire un jour.

-- Postgres
SELECT
  DATE_TRUNC('month', order_ts)                              AS month_start,
  DATE_TRUNC('month', order_ts) + INTERVAL '1 month - 1 day' AS month_end
FROM orders;

-- MySQL: LAST_DAY(order_ts)

Vérification rapide

Vérifiez votre compréhension du comportement des différences de dates selon les dialectes.

Récapitulatif : calcul des dates et intervalles

Points clés à retenir pour l'entretien :

  • Utilisez les valeurs INTERVAL avec +/- dans PostgreSQL ; DATE_ADD/DATEDIFF dans MySQL ; DATEADD/DATEDIFF dans le serveur SQL.
  • DATEDIFF du serveur SQL compte les franchissements de limites, et non les unités écoulées : c'est le piège principal.
  • Pour calculer l'âge en années, extrayez la valeur de AGE() plutôt que de diviser le nombre de jours par 365.
  • Filtrez les lignes récentes en comparant la colonne à un seuil calculé et utilisez des intervalles semi-ouverts (>= start AND < next) pour les périodes mensuelles.

Énoncez d'abord le concept, puis adaptez le dialecte.

Questions Fréquemment Posées

La leçon « Calcul arithmétique sur les dates et intervalles » est-elle gratuite ?

Oui — le texte complet de « Calcul arithmétique sur les dates et intervalles » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Interview Prep, passe à CoddyKit PRO. Le cours SQL Interview Prep comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Calcul arithmétique sur les dates et intervalles » ?

Ajouter ou soustraire des périodes et calculer les écarts entre les dates Tu pratiques SQL Interview Prep avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer SQL Interview Prep ?

Aucune expérience préalable n'est requise. SQL Interview Prep sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Calcul arithmétique sur les dates et intervalles » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon SQL Interview Prep ?

Oui. Chaque leçon SQL Interview Prep inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Calcul arithmétique sur les dates et intervalles
  2. Tronquer et regrouper les dates
  3. Analyser et formater des chaînes
  4. Fuseaux horaires et horodatages
← Retour à SQL Interview Prep