powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Номер недели!
30 сообщений из 30, показаны все 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
Номер недели!
    #32060351
Trampler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to SAA_

Читай внимательно -
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
Номер недели!
    #32060387
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"select to_char(to_date('31.12.2002', 'DD.MM.YYYY'), 'IW') возвращает 01 вместо 53"

Да, я согласен, формально должно быть 53, а не 1. Но ведь эта неделя не полная, в неё входит только понедельник и вторник(30 и 31). Остальные дни недели относятся к другому году и являются именно первой неделей следующего года. Можем ли мы утверждать что это именно 53 неделя? Может ли она считатся полноценной неделей? Ведь неделя это не два дня, а семь дней, то есть начиная (для России) с понедельника и заканчивая воскресеньем.
Если мы будем считать что это 53 неделя 2002 года и 1 неделя 2003 года одновременно, то при подсчёте недель в двух годах, получим одну лишнюю неделю, которая учлась дважды. Правильно ли это?
Или такой пример: возьмём скажем следующую неделю октября 2002г., с 28 октября по 3 ноября. Так вот, относительно реального календаря это одна неделя, а не две. Не две, только потомучто она попала в два месяца.
Поэтому "select to_char(to_date('31.12.2002', 'DD.MM.YYYY'), 'IW') возвращает 01 вместо 53", выглядит вполне логичным.
Использование маски 'IW' даёт именно то что Andrey хотел.
"Ошибка" происходит только для дней года последней недели, если она не заканчивается воскресеньем.
Для этого можно делать отдельную проверку, а в основном пользоваться IW.
...
Рейтинг: 0 / 0
Номер недели!
    #32060409
Trampler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To softbulder

Извини, но ты опять не прав.

Использование маски 'IW' даёт именно то что Andrey хотел. Как известно, он хотел "номер недели относительно реального календаря ..."
То есть, ну уж никак не хотел
to_char(to_date('01.01.2005', 'DD.MM.YYYY'), 'IW') = 53.
Да и про "ошибку" все совсем не так.

Еще раз, правильный с точки зрения постановки вопроса вариант был предложен - 18 окт 02, 16:52.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Номер недели!
    #39746457
Festani_10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreyВсе было бы здорово, если бы
SELECT TO_CHAR(TO_DATE('07-JAN-2002','DD-MON-YY'), 'WW') "New Year" FROM DUAL;
давало вторую неделю, а не первую ..
а мне бы нужно номер недели относительно реального календаря ...

SELECT TO_CHAR(TO_DATE('07-JAN-2002','DD-MON-YY'), 'IW') "New Year" FROM DUAL;
...
Рейтинг: 0 / 0
Номер недели!
    #39746529
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Festani_10,

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


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