Sources MySQL
Sources MySQLConsultez toutes les sources
Nombre d'auteurs : 10, nombre de sources : 21, dernière mise à jour : 9 octobre 2010
- 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'
)
;
86462
Un 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'
)
;
1441
Un 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'
)
;
51
Un 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'
)
;
63
Un 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'
)
;
2
Un 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'
)
;
4
Cette 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