powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Номер недели!
25 сообщений из 30, страница 1 из 2
Номер недели!
    #32058841
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, подскажите как вычислить номер недели в году. Я что-то не нашел никакой функции ...
PS. версия 8i
...
Рейтинг: 0 / 0
Номер недели!
    #32058848
Trampler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEIL ((p_date - round(p_date,'YEAR'))/7) ?
...
Рейтинг: 0 / 0
Номер недели!
    #32058849
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кажется маска формата ww (в доке есть, проверь)
...
Рейтинг: 0 / 0
Номер недели!
    #32058851
Gast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi
TO_CHAR (DATE ,'PARAMETER')

Parameter

WW Week of the year (1-53)
IW Week of the year (1-52, 1-53) ISO standard
W Week of month (1-5)
...
Рейтинг: 0 / 0
Номер недели!
    #32058856
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все было бы здорово, если бы
SELECT TO_CHAR(TO_DATE('07-JAN-2002','DD-MON-YY'), 'WW') "New Year" FROM DUAL;
давало вторую неделю, а не первую ..
а мне бы нужно номер недели относительно реального календаря ...
...
Рейтинг: 0 / 0
Номер недели!
    #32058861
Trampler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй

CEIL ((p_date - next_day(round(p_date,'YEAR'),'Monday'))/7) + 1

;))
...
Рейтинг: 0 / 0
Номер недели!
    #32058875
Trampler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле работает

Код: plaintext
1.
2.
3.
select CEIL ((to_date('07.01.2002','dd.mm.yyyy') - 
             next_day(round(to_date('07.01.2002','dd.mm.yyyy'),'YEAR'),'Воскресенье'))/ 7 )
             +  1 
from sys.dual


вот только "Воскресенье" или "Sunday" - вещь, зависящая от NLS-а
...
Рейтинг: 0 / 0
Номер недели!
    #32058891
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Trampler: спасибо
...
Рейтинг: 0 / 0
Номер недели!
    #32059156
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А попробуй:
Код: plaintext
1.
select to_char(sysdate,'ww') from dual;

В 9-ке работает.
...
Рейтинг: 0 / 0
Номер недели!
    #32059193
Славик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Trampler:
Твой код даст правильный результат только в этом году.
А в следующем - прийдеться менять (а осталось 2.5 месяца). А как узнать номер недели 20.12.2001 - в минус пойдем!!!
Надо свою функцию писать.
...
Рейтинг: 0 / 0
Номер недели!
    #32059341
Trampler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Slavik

Ты прав, конечно же должен быть TRUNC -

Код: plaintext
1.
2.
3.
select CEIL ((to_date('07.01.2002','dd.mm.yyyy') - 
             next_day(TRUNC(to_date('07.01.2002','dd.mm.yyyy'),'YEAR'),'Воскресенье'))/ 7 )
             +  1 
from sys.dual


Andrey, Этот вариант правильнее.
...
Рейтинг: 0 / 0
Номер недели!
    #32059620
SAA_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Славик

> to Trampler:
> Твой код даст правильный результат только в этом году.
> А в следующем - прийдеться менять (а осталось 2.5
> месяца). А как узнать номер недели 20.12.2001 - в
> минус пойдем!!!
> Надо свою функцию писать.


А вы вообще-то попробовали использовать
to_char(<date>, 'IW') ???

Если вы бы попробовали, то убедились, что номер недели определяется не относительно текущего года, а относительно начала года заданного в <date>
...
Рейтинг: 0 / 0
Номер недели!
    #32059632
Славик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to SAA_
Все классно! Но проверь : 31.12.2002 - возврат 01.
...
Рейтинг: 0 / 0
Номер недели!
    #32059638
Trampler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой вариант вроде рабочий, раз никто пока не раскритиковал. Насчет
номер недели определяется не относительно текущего года, а относительно начала года заданного в <date> - разве это действительно так? Тогда 01.01.2002 - в 53-й неделе 2001 что-ли? Да и использование to_char(<date>, 'IW') наверняка сделано под Sunday..Saturday а не под Понед..Воскр.
...
Рейтинг: 0 / 0
Номер недели!
    #32059681
SAA_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что проверить влом??? Так сложно???

В документации сказано: IW - Неделя года, в основе лежит стандарт ISO.

WW - неделя года. Неделя 1 начинается с первого дня года и продолжается до седьмого дня. Каким образом, недели не всегда начинаются с воскресенья (как принято в США)

Используй ISO и никогда у тебя не будет проблем с совместимостями и пр. Всегда можно отмазаться понятием СТАНДАРТ
...
Рейтинг: 0 / 0
Номер недели!
    #32059712
Славик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to SAA_
Ты наверно не помимаешь. Вопрос: "а мне бы нужно номер недели относительно реального календаря ..." ? Не ISO!!! Какие тут могут быть отмазки?

to Trampler, помоему у тебя есть ошибка.

to Andrey, проверь этот
Код: plaintext
1.
2.
3.
4.
create or replace function number_of_week (dt date) return number
is
begin
  return ceil(greatest( 1 ,(dt-next_day(trunc(dt,'yyyy')- 1 ,'SUNDAY'))/ 7 + 1 ));
end;
...
Рейтинг: 0 / 0
Номер недели!
    #32059720
Славик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Trampler:
в твоем коде ошибка: на 01.01.2006 - неделя 0
...
Рейтинг: 0 / 0
Номер недели!
    #32059764
Trampler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То Славик

Ты прав. Ошибка действительно есть. ИМХО конечно, но лучше использовать SQL, если есть возможность. Специально проверил твою функцию и аналогичный запрос - функция работает примерно в 6 раз медленнее, разве что индекс на нее сделать. И потом, лучше все-таки не использовать в явном виде 'Sunday' или 'Воскресенье' -

Код: plaintext
1.
2.
SELECT ceil(greatest( 1 ,(R_DATE-next_day(trunc(R_DATE,'yyyy')- 1 ,
                        to_char(to_date('30.12.2001','dd.mm.yyyy'),'Day')))/ 7 + 1 ))
FROM TABLE;


R_DATE - столбец в таблице TABLE
30.12.2001 - Воскресенье или Sunday ;) Кстати, может кто-нибудь знает как это написать менее коряво? ;))
...
Рейтинг: 0 / 0
Номер недели!
    #32059833
Славик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну коль до "Sunday" добрались, подскажите,
почему
Код: plaintext
select next_day(sysdate, 1 ) from dual
работает нормальною, а если запихнуть next_day(sysdate,1) в функцию, то ошибка?
...
Рейтинг: 0 / 0
Номер недели!
    #32059840
Trampler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create or replace function Test4 return date
is
v_date date;
begin
select next_day(sysdate, 1 ) 
into v_date
from dual;
return v_date;
end;


разве не работает??
...
Рейтинг: 0 / 0
Номер недели!
    #32059852
Славик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Твой пример работает, но чето я не пойму почему здесь не хочет?
Тогда вопрос с "Sunday", прекрасно решился бы
Код: plaintext
1.
2.
3.
4.
create or replace function number_of_week (dt date) return number
is
begin
  return ceil(greatest( 1 ,(dt-next_day(trunc(dt,'yyyy')- 1 , 1 ))/ 7 + 1 ));
end;
...
Рейтинг: 0 / 0
Номер недели!
    #32059975
SAA_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select to_char(to_date('31.12.2002', 'DD.MM.YYYY'), 'WW') from dual

возвращает 53
...
Рейтинг: 0 / 0
Номер недели!
    #32060251
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Человек просил что-бы '07-JAN-2002' - было второй неделей. SELECT TO_CHAR(TO_DATE('07-JAN-2002','DD-MON-YY'), 'IW') "New Year" FROM DUAL - это и даёт.
О чём спор-то?
...
Рейтинг: 0 / 0
Номер недели!
    #32060303
Trampler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понимаю, проблема в том, что

select to_char(to_date('31.12.2002', 'DD.MM.YYYY'), 'IW') возвращает 01 вместо 53
а
select to_char(to_date('07.01.2002', 'DD.MM.YYYY'), 'WW') возвращает 01 вместо 02

вместо - потому что вопрос: "а мне бы нужно номер недели относительно реального календаря ..." Вот и все.
...
Рейтинг: 0 / 0
Номер недели!
    #32060347
SAA_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select to_char(to_date('31.12.2002', 'DD.MM.YYYY'), 'WW') from dual

возвращает 53

(достало.... уже по второму кругу долбитесь)
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Номер недели!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]