2014-01-10 4 views
0

Это то, что я использую прямо сейчас, и она возвращает количество дней между BeginDate и ENDDATEВозвращает номер недели в Postgres

date(' $(@endDate)') - date('$(@beginDate)') as weekNumber 

Как я могу получить его, чтобы возвращать число недель между этими двумя?

+1

Определить "несколько недель". В точку. –

+0

Как указывает Эрвин, это зависит от того, что именно вы хотите. Хочешь целых недели? Не начинаются ли недели с первого дня «beginDate» или начинаются ли они с определенной фиксированной даты, поэтому у вас может быть частичная неделя с каждой стороны? Вы сообщаете о частичных неделях дробно? и т.п. –

ответ

0

Самый простой способ состоит в том, чтобы разделить количество дней на семь, хотя это не учитывало бы начальный день недели.

Вы могли бы использовать это вместо того, чтобы:

extract (week from date '$(@endDate)') -extract (week from date '$(@startDate)') 

, который будет использовать ISO8601 номера недель. Но остерегайтесь охватывающих годы!

0

Версия 1:

/* 
Design: 
    Week begins on day of start date 
    Options: 
     1) Count only whole weeks 
     2) Count partial weeks on the right side (end date side) 
*/ 

    select 
     sum(case when ('2013-02-08'::date - ind::date) >= 7 then 1 else 0 end) as whole_weeks, 
     count(*) as partial_right 
    from 
     generate_series('2013-01-01'::date /*dow=2*/,'2013-02-05'::date /*dow=2*/,'7 days') ind 

Версия 2:

/* 
Design: 
    Week begins on specific day of week (5 chosen in this example) 
    Options: 
     1) Count only whole weeks 
     2) Count partial weeks on the right side (end date side) 
     3) Count partial weeks on the left side (start date side) 
     4) Count partial weeks on both sides 
*/ 

select 
    sum(case when days = 7 then 1 else 0 end) as whole_weeks, 
    sum(case when days = 7 or max_ind = week_start then 1 else 0 end) as partial_right, 
    sum(case when days = 7 or week_start < min_ind then 1 else 0 end) as partial_left, 
    count(*) as partial_both_sides 
from 
(
    select 
     ind - (case when dow < bow then dow + 7 - bow else dow - bow end)::int as week_start, 
     count(*) as days, 
     min(ind) as min_ind, 
     max(ind) as max_ind 
    from 
     (select 
     ind::date as ind, 
     extract(isodow from ind) as dow, 
     5::int as bow 
     from 
     generate_series('2013-01-01'::date /*dow=2*/,'2013-02-08'::date /*dow=5*/,'1 day') ind 
    ) inp 
    group by 
     week_start 
) t 
Смежные вопросы