128 votes

Comment obtenir la différence de jours/mois/années (datediff) entre deux dates ?

Je cherche un moyen de mettre en œuvre la Fonction SQLServer datée dans PostgreSQL. En d'autres termes, cette fonction renvoie le nombre (sous la forme d'un nombre entier signé) de limites de parties de date spécifiées franchies entre la date de début et la date de fin spécifiées.

datediff(dd, '2010-04-01', '2012-03-05') = 704 // 704 changes of day in this interval
datediff(mm, '2010-04-01', '2012-03-05') = 23  // 23 changes of month
datediff(yy, '2010-04-01', '2012-03-05') = 2   // 2 changes of year

Je sais que je pourrais faire 'dd' en utilisant simplement la soustraction, mais une idée pour les deux autres ?

206voto

mehdi Points 1209

Il suffit de les soustraire :

SELECT ('2015-01-12'::date - '2015-01-01'::date) AS days;

Le résultat :

 days
------
   11

150voto

Igor Romanchenko Points 22768
SELECT
  AGE('2012-03-05', '2010-04-01'),
  DATE_PART('year', AGE('2012-03-05', '2010-04-01')) AS years,
  DATE_PART('month', AGE('2012-03-05', '2010-04-01')) AS months,
  DATE_PART('day', AGE('2012-03-05', '2010-04-01')) AS days;

Cela vous donnera complet années, mois, jours ... entre deux dates :

          age          | years | months | days
-----------------------+-------+--------+------
 1 year 11 mons 4 days |     1 |     11 |    4

Plus de détails informations sur les datas .

58voto

WebWanderer Points 324

J'ai passé du temps à chercher la meilleure réponse, et je pense l'avoir trouvée.

Ce sql vous donnera le nombre de jours entre deux dates comme suit integer :

SELECT
    (EXTRACT(epoch from age('2017-6-15', now())) / 86400)::int

qui, lorsqu'il est exécuté aujourd'hui ( 2017-3-28 ), me fournit :

?column?
------------
77

L'idée fausse de la réponse acceptée :

select age('2010-04-01', '2012-03-05'),
   date_part('year',age('2010-04-01', '2012-03-05')),
   date_part('month',age('2010-04-01', '2012-03-05')),
   date_part('day',age('2010-04-01', '2012-03-05'));

est que vous obtiendrez la différence littérale entre les parties des chaînes de dates, et non le temps écoulé entre les deux dates.

I.E :

Age(interval)=-1 years -11 mons -4 days;

Years(double precision)=-1;

Months(double precision)=-11;

Days(double precision)=-4;

13voto

Riki_tiki_tavi Points 713

Presque la même fonction que celle dont vous aviez besoin (basée sur la réponse d'atiruz, version abrégée de l'UDF de aquí )

CREATE OR REPLACE FUNCTION datediff(type VARCHAR, date_from DATE, date_to DATE) RETURNS INTEGER LANGUAGE plpgsql
AS
$$
DECLARE age INTERVAL;
BEGIN
    CASE type
        WHEN 'year' THEN
            RETURN date_part('year', date_to) - date_part('year', date_from);
        WHEN 'month' THEN
            age := age(date_to, date_from);
            RETURN date_part('year', age) * 12 + date_part('month', age);
        ELSE
            RETURN (date_to - date_from)::int;
    END CASE;
END;
$$;

Utilisation :

/* Get months count between two dates */
SELECT datediff('month', '2015-02-14'::date, '2016-01-03'::date);
/* Result: 10 */

/* Get years count between two dates */
SELECT datediff('year', '2015-02-14'::date, '2016-01-03'::date);
/* Result: 1 */

/* Get days count between two dates */
SELECT datediff('day', '2015-02-14'::date, '2016-01-03'::date);
/* Result: 323 */

/* Get months count between specified and current date */
SELECT datediff('month', '2015-02-14'::date, NOW()::date);
/* Result: 47 */

7voto

atiruz Points 358
SELECT date_part ('year', f) * 12
     + date_part ('month', f)
FROM age ('2015-06-12'::DATE, '2014-12-01'::DATE) f

Résultat : 6

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X