Вопрос расчета недели Oracle - PullRequest
       8

Вопрос расчета недели Oracle

2 голосов
/ 17 февраля 2010

Я использую функцию Oracle to_char () для преобразования даты в число недели (1-53):

select  pat_id, 
    pat_enc_csn_id, 
    contact_date, 
    to_char(contact_date,'ww') week,
    ...

переключатель 'ww' дает мне следующие значения для дат в январе этого года:

Date        Week
1-Jan-10    1
2-Jan-10    1
3-Jan-10    1
4-Jan-10    1
5-Jan-10    1
6-Jan-10    1
7-Jan-10    1
8-Jan-10    2
9-Jan-10    2
10-Jan-10   2
11-Jan-10   2
12-Jan-10   2

быстрый просмотр календаря показывает, что эти значения должны быть:

Date         Week
1-Jan-10    1
2-Jan-10    1
3-Jan-10    2
4-Jan-10    2
5-Jan-10    2
6-Jan-10    2
7-Jan-10    2
8-Jan-10    2
9-Jan-10    2
10-Jan-10    3
11-Jan-10    3
12-Jan-10    3

если я использую переключатель 'iw' вместо 'ww', результат будет менее желательным:

Date         Week
1-Jan-10    53
2-Jan-10    53
3-Jan-10    53
4-Jan-10    1
5-Jan-10    1
6-Jan-10    1
7-Jan-10    1
8-Jan-10    1
9-Jan-10    1
10-Jan-10   1
11-Jan-10   2
12-Jan-10   2

Есть ли другая функция Oracle, которая будет рассчитывать недели, как я ожидал, или мне нужно написать свою собственную?

EDIT

Я пытаюсь соответствовать логике, используемой Crystal Reports. Каждая полная неделя начинается в воскресенье; первая неделя года начинается с того дня, который представлен 1 января (например, в 2010 году 1 января - пятница).

Ответы [ 4 ]

1 голос
/ 18 февраля 2010

При использовании IW Oracle следует стандарту ISO 8601 в отношении номеров недель (см. http://en.wikipedia.org/wiki/ISO_8601).. Это тот же стандарт, который мы обычно используем в Европе.

Ваша проблема также упоминается на форуме Oracle: http://forums.oracle.com/forums/thread.jspa?threadID=947291 и http://forums.oracle.com/forums/message.jspa?messageID=3318715#3318715. Возможно, вы сможете найти решение там.

0 голосов
/ 26 февраля 2013

Я знаю, что это старый, но все еще распространенный вопрос.

Это должно дать вам правильные результаты при минимальных усилиях:

select  pat_id, 
pat_enc_csn_id, 
contact_date, 
to_char(contact_date + 1,'IW') week,
...
0 голосов
/ 22 февраля 2010

Исходя из этого вопроса, Как рассчитать номер недели с учетом даты? , я написал следующую логику Oracle:

CASE
  --if [date field]'s day-of-week (e.g. Monday) is earlier than 1/1/YYYY's day-of-week
  WHEN to_char(to_date('01/01/' || to_char([date field],'YYYY'),'mm/dd/yyyy'), 'D') - to_char([date field], 'D') > 1 THEN
    --adjust the week
    trunc(to_char([date field], 'DDD') / 7) + 1 + 1 --'+ 1 + 1' used for clarity
  ELSE trunc(to_char([date field], 'DDD') / 7) + 1
END calendar_week
0 голосов
/ 17 февраля 2010

Поскольку, похоже, вы используете ваше собственное специальное определение номера недели, вам нужно написать свою собственную функцию.

Может быть полезно, чтобы NLS_TERRITORY влиял на день, с которого начинается неделя, как используется моделью формата D

см. Также:

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements004.htm#SQLRF00210

и

http://www.adp -gmbh.ch / ора / SQL / to_char.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...