Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédente | |||
cookbook:nombre_semaines_entre_2_dates [2008/10/14 18:47] – ioguix | cookbook:nombre_semaines_entre_2_dates [2008/10/15 16:49] (Version actuelle) – effacée ioguix | ||
---|---|---|---|
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, | ||
- | |||
- | On va donc faire ça en deux temps, d' | ||
- | |||
- | Déjà, trouver les années comprises entre deux dates, ainsi que le premier janvier de l' | ||
- | |||
- | <code sql> | ||
- | dim=> select year, to_date(year+1, | ||
- | from generate_series(extract(year from (current_date - interval '4 years' | ||
- | extract(year from current_date):: | ||
- | year | d | ||
- | ------+------------ | ||
- | 2003 | 01-01-2004 | ||
- | 2004 | 01-01-2005 | ||
- | 2005 | 01-01-2006 | ||
- | 2006 | 01-01-2007 | ||
- | 2007 | 01-01-2008 | ||
- | (5 lignes) | ||
- | </ | ||
- | |||
- | |||
- | Maintenant, première ruse : si le premier janvier de l' | ||
- | |||
- | <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 ( | ||
- | | ||
- | from generate_series(extract(year from (current_date - interval '4 years' | ||
- | extract(year from current_date):: | ||
- | year | nb_weeks | ||
- | ------+---------- | ||
- | 2003 | 52 | ||
- | 2004 | 53 | ||
- | 2005 | 52 | ||
- | 2006 | 52 | ||
- | 2007 | 52 | ||
- | (5 lignes) | ||
- | </ | ||
- | |||
- | |||
- | Il reste à additionner toutes les semaines des années intermédiaires et à ajouter le numéro de semaine de l' | ||
- | |||
- | <code sql> | ||
- | create or replace function weeks(timestamp, | ||
- | 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 ), | ||
- | | ||
- | - | ||
- | | ||
- | from ( | ||
- | | ||
- | 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', | ||
- | weeks | ||
- | ------- | ||
- | 79 | ||
- | (1 ligne) | ||
- | |||
- | dim=> select weeks(current_date - interval '4 years', | ||
- | weeks | ||
- | ------- | ||
- | 209 | ||
- | (1 ligne) </ | ||
- | |||
- | Et voilà :) | ||
- | |||
- | Note : on utilise '' | ||
- | |||
- | -- \\ | ||
- | Par dim le 28/11/2007 |