2016-02-13 3 views
0

У меня есть таблица task_details. Мне нужно выбрать его еженедельную дату из этой таблицы. Я использовал ISO Год & Неделя ISO, чтобы извлечь еженедельные даты из этой таблицы, так как я хочу извлечь ее номер недели как 53, если ее декабрь 2015 года, а затем в дни 28 декабря, 29 декабря, 30 декабря, 31 декабря и 1 января '16, 2 января '16, поскольку он не должен отделяться от двух разных недель для таких дат.
Запрос, который я использовал для ISO Год & ISO-неделя приведена ниже.Получение странного результата для ISO Дата в Postgresql

select 
    name, id, 
    to_date(week || ' ' || yr, 'IW IYYY') week_date, 
    sum(worked_hours) worked_hours_per_week, 
    week, yr 
from (
    select 
     name, id, 
     newdate, hours worked_hours, 
     to_number(to_char(newdate, 'IW'), '99') week, 
     extract(year from newdate) yr 
    from task_details t 
) sub 
where worked_hours > 0 
group by name, id, to_date(week || ' ' || yr, 'IW IYYY'), week, yr 
order by yr, week 

Он работает отлично на недели, но затем я получаю этот странный результат для одной даты для записи в таблице.
таблица не имеет данных за год 2017.Also, то года колонок показывает 2016 год, который по желанию, но тогда newdate колонки и недели колонок дают странный результата . Почему это происходит? Как это исправить ?

Вот SQL скрипку для него: http://sqlfiddle.com/#!15/53abf/1

+1

Очень творческий формат. Вам может быть интересна эта небольшая страница помощника: http://stackoverflow.com/editing-help. При обновлении формата не забудьте включить вашу версию Postgres и правильное определение таблицы. –

ответ

2

Не следует смешивать week с year в функции экстракта в качестве year для Григорианского календаря, а не специальный календарь ISO.

См. section 9.9.1 and comments about week.

to_number(to_char(newdate, 'IW'), '99') эффективно extract(week from newdate)

Изменение yr колонки быть extract(isoyear from newdate) решает вашу проблему.

Adjusted SQL Fiddle

1

@gwaigh уже прояснилось ваше замешательство григорианского и ISO года.

Однако, ваш запрос будет проще и быстрее с date_trunc(), чтобы получить первый день каждой недели:

SELECT name, id 
    , date_trunc('week', newdate)::date AS week_date 
    , extract(week FROM newdate)::int  AS week 
    , extract(isoyear from newdate)::int AS isoyr -- must be ISO year to match 
    , sum(hours)       AS worked_hours_per_week 
FROM task_details 
WHERE hours > 0 
GROUP BY name, id, week_date, week, yr 
ORDER BY week_date;

упрощена Также ваш запрос.

SQL Fiddle.

В любом случае, если вы работаете с timestamptz то год, недели или даты в зависимости от текущей настройки часового пояса. (Это может быть другой год, в зависимости от того, где вы сейчас находитесь.)

Смежные вопросы