PostgreSQL La base de donnees la plus sophistiquee au monde.

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

support:trucs_et_astuces:nombre_de_semaines_entre_deux_dates_quelconques [2008/10/15 16:49] (Version actuelle)
ioguix créée
Ligne 1: Ligne 1:
 +====== Nombre de semaines entre deux dates quelconques ======
  
 +Cette fois-ci il s'agit donc de trouver le nombre de semaines entre deux dates quelconques. Ce qui rend la solution un poil compliquée, c'est que toutes les années n'ont pas le même nombre de semaines (52*7 ça donne que 364 jours).
 +
 +On va donc faire ça en deux temps, d'abord trouver le nombre de semaines de chaque année faisant partie de l'intervalle, ensuite c'est facile.
 +
 +Déjà, trouver les années comprises entre deux dates, ainsi que le premier janvier de l'année suivante :
 +
 +<code sql>
 +dim=> select year, to_date(year+1, 'YYYY-01-01') as d
 + from generate_series(extract(year from (current_date - interval '4 years')::date)::int,
 +          extract(year from current_date)::int) as year;
 + year | d
 +------+------------
 + 2003 | 01-01-2004
 + 2004 | 01-01-2005
 + 2005 | 01-01-2006
 + 2006 | 01-01-2007
 + 2007 | 01-01-2008
 +(5 lignes) 
 +</code>
 +
 +
 +Maintenant, première ruse : si le premier janvier de l'année suivante est semaine 1, alors l'année donnée contient 52 semaines, sinon elle contient le nombre de semaine correspondant au numéro de semaine du premier janvier de l'année suivante :
 +
 +<code sql>
 +dim=> select extract(year from d) - 1 as year,
 +       case when extract(week from d) = 1
 +        then extract(week from d - interval '1 week')
 +        else extract(week from d)
 +       end as nb_weeks
 +      from (
 +       select year, to_date(year+1, 'YYYY-01-01') as d
 +       from generate_series(extract(year from (current_date - interval '4 years')::date)::int,
 +      extract(year from current_date)::int) as year) as x;
 + year | nb_weeks
 +------+----------
 + 2003 | 52
 + 2004 | 53
 + 2005 | 52
 + 2006 | 52
 + 2007 | 52
 +(5 lignes) 
 +</code>
 +
 +
 +Il reste à additionner toutes les semaines des années intermédiaires et à ajouter le numéro de semaine de l'année courante pour avoir le nombre de semaines depuis le premier janvier de l'année de la date de début. On enlèvera donc de cette somme le numéro de semaine de la date de début pour avoir notre résultat :
 +
 +<code sql>
 +create or replace function weeks(timestamp, timestamp) returns int language sql
 +as $$
 +  select extract(week from $2)::int
 +  +
 +  coalesce(
 +   sum( case when extract(week from d) = 1
 +    then extract(week from d - interval '1 week')
 +    else extract(week from d) end ),
 +   0)::int
 +   -
 +   extract(week from $1)::int
 +  from (
 +   select year, to_date(year+1, 'YYYY-01-01') as d
 +   from generate_series(extract(year from $1)::int,
 +    extract(year from $2)::int - 1) as year
 +   ) as x;
 +$$;
 + 
 +dim=> select weeks(current_date - interval '18 months', current_date);
 + weeks
 +-------
 +   79
 +(1 ligne)
 + 
 +dim=> select weeks(current_date - interval '4 years', current_date);
 + weeks
 +-------
 +   209
 +(1 ligne) </code>
 +
 +Et voilà :)
 +
 +Note : on utilise ''COALESCE()'' sur le ''SUM()'' afin de savoir compter le nombre de semaines entre deux dates de la même année aussi !
 +
 +-- \\
 +Par dim le 28/11/2007
 
support/trucs_et_astuces/nombre_de_semaines_entre_deux_dates_quelconques.txt · Dernière modification: 2008/10/15 16:49 de ioguix