
Combien de fois avons nous écrit un TO_CHAR(date, 'Q') pour sortir un état par trimestre ? Et combien de fois avons-nous calculé un MONTHS_BETWEEN(date, debut_exercice) pour retrouver le trimestre fiscal, parce que l’exercice commençait en juillet et pas en janvier ?
Avec Oracle 26ai, une seule fonction suffit, on lui donne une date, elle nous rend l’année, le trimestre, le mois, la semaine ou le jour, dans le calendrier civil, fiscal…. Ce sont les Calendar Functions que je vais vous présenter dans cet article.
Que font les Calendar Functions ?
Elles se répartissent en trois familles, faciles à reconnaître par leur préfixe : CALENDAR_ pour le calendrier civil, FISCAL_ pour un exercice qui démarre à la date de notre choix, et RETAIL_ pour le calendrier des magasins et de la grande distribution.
Dans chaque famille, on retrouve les mêmes outils. Certaines fonctions donnent le nom de la période, comme CALENDAR_QUARTER ou CALENDAR_MONTH. D’autres donnent la date de début ou de fin d’une période, comme CALENDAR_MONTH_END_DATE. D’autres encore donnent un numéro, comme le jour de l’année avec CALENDAR_DAY_OF_YEAR. Et il y a celles qui ajoutent des périodes à une date, comme CALENDAR_ADD_MONTHS.
Pratiquons ces fonctions !
Pour tester, nous allons créer une petite table de factures clients :
SQL> CREATE TABLE factures (
id_facture NUMBER PRIMARY KEY,
date_facture DATE NOT NULL,
montant_ht NUMBER(10,2) NOT NULL
); 2 3 4 5
Table creee.
SQL> INSERT INTO factures VALUES (1, DATE '2026-01-15', 4200);
INSERT INTO factures VALUES (2, DATE '2026-02-03', 1800);
INSERT INTO factures VALUES (3, DATE '2026-04-20', 3100);
INSERT INTO factures VALUES (4, DATE '2026-07-08', 2500);
INSERT INTO factures VALUES (5, DATE '2026-09-14', 5000);
INSERT INTO factures VALUES (6, DATE '2027-01-10', 2700);
COMMIT;
1 ligne creee.
SQL>
1 ligne creee.
SQL>
1 ligne creee.
SQL>
1 ligne creee.
SQL>
1 ligne creee.
SQL>
1 ligne creee.
SQL>
Validation effectuee.
SQL>
Langage du code : PHP (php)Nous allons regrouper le chiffre d’affaires par trimestre.
SQL> SELECT calendar_quarter(date_facture) AS trimestre,
COUNT(*) AS nb_factures,
SUM(montant_ht) AS total_ht
FROM factures
GROUP BY calendar_quarter(date_facture)
ORDER BY trimestre; 2 3 4 5 6
TRIMESTR NB_FACTURES TOTAL_HT
-------- ----------- ----------
Q1-2026 2 6000
Q1-2027 1 2700
Q2-2026 1 3100
Q3-2026 2 7500
SQL>
Langage du code : PHP (php)Nous allons chercher les date de début et de fin pour une facture
SQL> SELECT id_facture,
calendar_month_end_date(date_facture) AS cloture_du_mois,
calendar_add_months(date_facture, 1) AS echeance_paiement
FROM factures
WHERE id_facture = 5; 2 3 4 5
ID_FACTURE CLOTURE_ ECHEANCE
---------- -------- --------
5 30/09/26 14/10/26
Langage du code : PHP (php)Nous allons maintenant voir le calendrier fiscal et c’est là que ces fonctions deviennent vraiment pratiques. Imaginons un exercice qui commence le 1er juillet. Il suffit de donner cette date de début en deuxième argument.
SQL> SELECT id_facture,
date_facture,
fiscal_year(date_facture, DATE '2026-07-01') AS exercice,
fiscal_quarter(date_facture, DATE '2026-07-01') AS trimestre_fiscal
FROM factures
ORDER BY date_facture; 2 3 4 5 6
ID_FACTURE DATE_FAC EXERCIC TRIMESTRE_
---------- -------- ------- ----------
1 15/01/26 FY2026 Q3-FY2026
2 03/02/26 FY2026 Q3-FY2026
3 20/04/26 FY2026 Q4-FY2026
4 08/07/26 FY2027 Q1-FY2027
5 14/09/26 FY2027 Q1-FY2027
6 10/01/27 FY2027 Q3-FY2027
6 lignes selectionnees.
Langage du code : PHP (php)Les trois premières factures appartiennent à l’exercice FY2026, qui se termine le 30 juin 2026. À partir de juillet, nous sommes dans FY2027. L’exercice porte le nom de l’année où il se termine, et le premier trimestre de l’exercice va de juillet à septembre.
Passons maintenant au chiffre d’affaires par exercice :
SQL> SELECT fiscal_year(date_facture, DATE '2026-07-01') AS exercice,
COUNT(*) AS nb_factures,
SUM(montant_ht) AS total_ht
FROM factures
GROUP BY fiscal_year(date_facture, DATE '2026-07-01')
ORDER BY MIN(date_facture); 2 3 4 5 6
EXERCIC NB_FACTURES TOTAL_HT
------- ----------- ----------
FY2026 3 9100
FY2027 3 10200
Langage du code : PHP (php)
Poster un Commentaire