Sources MySQL

Sources MySQLConsultez toutes les sources
Nombre d'auteurs : 10, nombre de sources : 21, dernière mise à jour : 9 octobre 2010
Sommaire→Traitement du temps- Nombre de secondes entre deux TIMESTAMP
- Nombre de minutes entre deux TIMESTAMP (dépendante de seconds_between)
- Nombre de minutes entre deux TIMESTAMP (indépendante)
- Nombre d'heures entre deux TIMESTAMP (dépendante de minutes_between)
- Nombre d'heures entre deux TIMESTAMP (indépendante)
- Nombre de jours entre deux DATE
- Nombre de mois entre deux DATE
- Nombre d'années entre deux DATE (dépendante de months_between)
- Nombre d'années entre deux DATE (indépendante)
Cette fonction prend en paramètre deux valeurs de type TIMESTAMP et retourne le nombre de secondes entre ces deux valeurs.
Il est possible de passer des valeurs de type DATE et l'ordre n'est pas important.
DROP FUNCTION IF EXISTS seconds_between;
DELIMITER $$
CREATE FUNCTION seconds_between (A TIMESTAMP, B TIMESTAMP) RETURNS INT
BEGIN
DECLARE RETURN_VALUE INT;
SET RETURN_VALUE = DATEDIFF(A, B) * 24 * 60 * 60 + (TIME_TO_SEC(A) - TIME_TO_SEC(B));
RETURN IF(RETURN_VALUE > 0, RETURN_VALUE, RETURN_VALUE * -1);
END
$$
DELIMITER ;SELECT seconds_between('2008-11-06 02:10:13', '2008-11-07 02:11:15');86462Un peu d'explications
Ici nous avons un écart d'un jour, une minute et deux secondes.
Un jour = 60 secondes * 60 minutes * 24 heures soit 86400 secondes.
Une minute = 60 secondes.
Nous obtenons donc 86400 + 60 + 2 soit 86462 secondes.
Cette fonction prend en paramètre deux valeurs de type TIMESTAMP et retourne le nombre de minutes entre ces deux valeurs.
Il est possible de passer des valeurs de type DATE et l'ordre n'est pas important.
Attention, cette fonction réutilise la fonction seconds_between, il est donc nécessaire d'avoir créé cette dernière, sans quoi une erreur sera retournée. Si vous préférez créer seulement minutes_between, une version équivalente est disponible.
DROP FUNCTION IF EXISTS minutes_between;
DELIMITER $$
CREATE FUNCTION minutes_between (A TIMESTAMP, B TIMESTAMP) RETURNS INT
BEGIN
RETURN seconds_between(A, B) DIV 60;
END
$$
DELIMITER ;SELECT minutes_between('2008-11-06 02:10:13', '2008-11-07 02:11:15');1441Un peu d'explications
Ici nous avons un écart d'un jour, une minute et deux secondes.
Un jour = 60 minutes * 24 heures soit 1440 minutes.
Nous obtenons donc 1440 + 1 soit 1441 minutes.
Cette fonction est strictement équivalente à celle-ci, sauf qu'elle ne dépend pas de seconds_between.
DROP FUNCTION IF EXISTS minutes_between;
DELIMITER $$
CREATE FUNCTION minutes_between (A TIMESTAMP, B TIMESTAMP) RETURNS INT
BEGIN
DECLARE RETURN_VALUE INT;
SET RETURN_VALUE = DATEDIFF(A, B) * 24 * 60 * 60 + (TIME_TO_SEC(A) - TIME_TO_SEC(B));
RETURN (IF(RETURN_VALUE > 0, RETURN_VALUE, RETURN_VALUE * -1)) DIV 60;
END
$$
DELIMITER ;SELECT minutes_between('2008-11-06 02:10:13', '2008-11-07 02:11:15');1441
Cette fonction prend en paramètre deux valeurs de type TIMESTAMP et retourne le nombre d'heures entre ces deux valeurs.
Il est possible de passer des valeurs de type DATE et l'ordre n'est pas important.
Attention, cette fonction réutilise la fonction minutes_between, il est donc nécessaire d'avoir créé cette dernière sans quoi une erreur sera retournée. Si vous préférez créer seulement hours_between, une version équivalente est disponible.
DROP FUNCTION IF EXISTS hours_between;
DELIMITER $$
CREATE FUNCTION hours_between (A TIMESTAMP, B TIMESTAMP) RETURNS INT
BEGIN
RETURN minutes_between(A, B) DIV 60;
END
$$
DELIMITER ;SELECT hours_between('2008-11-06 02:10:13', '2008-11-08 05:11:15');51Un peu d'explications
Ici nous avons un écart de deux jours, trois heures, une minute et deux secondes.
Deux jours = 24 heures * 2 jours soit 48 heures.
Nous obtenons donc 48 + 3 soit 51 heures.
Cette fonction est strictement équivalente à celle-ci, sauf qu'elle ne dépend pas de minutes_between.
DROP FUNCTION IF EXISTS hours_between;
DELIMITER $$
CREATE FUNCTION hours_between (A TIMESTAMP, B TIMESTAMP) RETURNS INT
BEGIN
DECLARE RETURN_VALUE INT;
SET RETURN_VALUE = DATEDIFF(A, B) * 24 * 60 * 60 + (TIME_TO_SEC(A) - TIME_TO_SEC(B));
RETURN (IF(RETURN_VALUE > 0, RETURN_VALUE, RETURN_VALUE * -1)) DIV (60 * 60);
END
$$
DELIMITER ;SELECT hours_between('2008-11-06 02:10:13', '2008-11-08 05:11:15');51
Cette fonction prend en paramètre deux valeurs de type DATE et retourne le nombre de jours entre ces deux valeurs.
Il est possible de passer des valeurs de type TIMESTAMP et l'ordre n'est pas important.
DROP FUNCTION IF EXISTS days_between;
DELIMITER $$
CREATE FUNCTION days_between (A DATE, B DATE) RETURNS INT
BEGIN
DECLARE RETURN_VALUE INT;
SET RETURN_VALUE = DATEDIFF(A, B);
RETURN (IF(RETURN_VALUE > 0, RETURN_VALUE, RETURN_VALUE * -1));
END
$$
DELIMITER ;SELECT days_between('2008-9-06', '2008-11-08');63Un peu d'explications
Ici nous voulons calculer le nombre de jours entre le 6 septembre 2008 et le 8 novembre 2008.
Nombre de jours en septembre = 30.
Nombre de jours en octobre = 31.
Nous obtenons donc (30 - 6) + 31 + 8 soit 63 jours.
Cette fonction prend en paramètre deux valeurs de type DATE et retourne le nombre de mois entre ces deux valeurs.
Il est possible de passer des valeurs de type TIMESTAMP et l'ordre n'est pas important.
L'écriture de cette fonction a été fortement inspirée par celle de Nathan Bunker.
DROP FUNCTION IF EXISTS months_between;
DELIMITER $$
CREATE FUNCTION months_between (A DATE, B DATE) RETURNS INT
BEGIN
DECLARE FIRST_DATE DATE;
DECLARE LAST_DATE DATE;
DECLARE DIFF INT;
SELECT IF(A > B, A, B) INTO LAST_DATE;
SELECT IF(A < B, A, B) INTO FIRST_DATE;
SET DIFF = PERIOD_DIFF(year(LAST_DATE)*100 + month(LAST_DATE), year(FIRST_DATE)*100 + month(FIRST_DATE));
SET DIFF = IF(DAY(FIRST_DATE) <= DAY(LAST_DATE), DIFF, DIFF - 1);
RETURN DIFF;
END
$$
DELIMITER ;SELECT months_between('2008-11-08', '2009-2-06');2Un peu d'explications
Ici nous voulons calculer le nombre de mois entre le 8 novembre 2008 et le 6 septembre 2009.
Liste des mois complets = decembre 2008, janvier 2008.
Ensuite entre le 8 et le 6 de deux mois il n'y a pas un mois complet (à deux jours près).
Nous obtenons donc 2 mois.
Cette fonction prend en paramètre deux valeurs de type DATE et retourne le nombre d'années entre ces deux valeurs.
Il est possible de passer des valeurs de type TIMESTAMP et l'ordre n'est pas important.
Attention, cette fonction réutilise la fonction months_between, il est donc nécessaire d'avoir créé cette dernière, faute de quoi une erreur sera retournée. Si vous préférez créer seulement years_between, une version équivalente est disponible.
DROP FUNCTION IF EXISTS years_between;
DELIMITER $$
CREATE FUNCTION years_between (A DATE, B DATE) RETURNS INT
BEGIN
RETURN months_between(A, B) DIV 12;
END
$$
DELIMITER ;SELECT years_between('2008-9-06', '2012-11-08');4Cette fonction est strictement équivalente à celle-ci, sauf qu'elle ne dépend pas de months_between.
DROP FUNCTION IF EXISTS years_between;
DELIMITER $$
CREATE FUNCTION years_between (A DATE, B DATE) RETURNS INT
BEGIN
DECLARE FIRST_DATE DATE;
DECLARE LAST_DATE DATE;
DECLARE DIFF INT;
SELECT IF(A > B, A, B) INTO LAST_DATE;
SELECT IF(A < B, A, B) INTO FIRST_DATE;
SET DIFF = PERIOD_DIFF(year(LAST_DATE)*100 + month(LAST_DATE), year(FIRST_DATE)*100 + month(FIRST_DATE));
SET DIFF = IF(DAY(FIRST_DATE) <= DAY(LAST_DATE), DIFF, DIFF - 1);
RETURN DIFF DIV 12;
END
$$
DELIMITER ;SELECT years_between('2008-9-06', '2012-11-08');4


