powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / первый день недели
25 сообщений из 60, страница 2 из 3
первый день недели
    #33508333
Фотография pan159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вариант годный для России, США, Англии:
select -- номер недели= 10
to_char(to_date('01/01/2006','DD/MM/YYYY')
+ 7 * 10 - to_char(to_date('01/01/2006','DD/MM/YYYY'),'D'),'DD/MM/YYYY') first_day_of_week,
to_char(to_date('01/01/2006','DD/MM/YYYY')
+ 7 * 10 - to_char(to_date('01/01/2006','DD/MM/YYYY'),'D'),'WW') week_number
from dual
Если алгоритм используется в области логистики для остальных стран Европы, то нужно его чуть подправить: использовать вместо WW формат WI.
...
Рейтинг: 0 / 0
первый день недели
    #33508347
Фотография scela
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно так:
Проверял и вперед и назад.
Опираемся на понедельник 2001г.
Вычисляем день недели даты, заданной годом и номером недели -
как остаток от деления на 7 разницы дат.
это будет смещение, которое нужно отнять и прибавить к дате, для получения первого и последнего дня.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT dt   /*Некая дата в году YY, неделя WW*/ 
      ,dt-day_of_week   first_day_of_week   /*Дата первого дня недели*/
      ,dt-day_of_week+ 6  last_day_of_week    /*Дата последнего дня недели*/
      ,day_of_week  /*День недели даты DT 0=ПН,6=ВС*/
  FROM ( 
       SELECT dt,point , md,DECODE( SIGN(md), - 1  ,md+ 7 , md) day_of_week    
         FROM ( SELECT dt,point , MOD( dt-point , 7 ) md                  
                  FROM ( SELECT TO_DATE('0101'||:YY, 'DDMMYY')+ 7 *(:week- 1 ) dt   /*Это просто дата, но в указанных году/недели*/   
                                ,TO_DATE('01-01-2001', 'DD-MM-YYYY') point  /*Это ПН 2001 года*/
                         FROM dual
                        )
              )
       )
Все. время принять пиво.
...
Рейтинг: 0 / 0
первый день недели
    #33508350
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to scela

спасибо пока работает хорошо, в понедельник еще протестирую на всё возможное
...
Рейтинг: 0 / 0
первый день недели
    #33508367
Фотография pan159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joanna: "определиться легко, первая неделя это результат этой функции
SELECT to_char(to_date('01-Jan-2004'),'iw') =01 "

А если укажете 01-Jun-2006, то получите 52. Европейцы переходящую неделю относят к предыдущему году, а американцы к следующему.
Так что у американцев последняя неделя года может иметь номер 1.

Что выбрать - зависит от назначения программы.
...
Рейтинг: 0 / 0
первый день недели
    #33510723
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pan159Joanna: "определиться легко, первая неделя это результат этой функции
SELECT to_char(to_date('01-Jan-2004'),'iw') =01 "

А если укажете 01-Jun-2006, то получите 52. Европейцы переходящую неделю относят к предыдущему году, а американцы к следующему.
Так что у американцев последняя неделя года может иметь номер 1.

Что выбрать - зависит от назначения программы.
всё правильно 1 января 1006 года это еще 52 неделя.
iw- это и есть европейская неделя
SELECT to_char(to_date('01-Jan-2004'),'iw') =01
SELECT to_char(to_date('01-Jan-2006'),'iw') =52
...
Рейтинг: 0 / 0
первый день недели
    #33510851
iV@n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
johanna pan159Joanna: "определиться легко, первая неделя это результат этой функции
SELECT to_char(to_date('01-Jan-2004'),'iw') =01 "

А если укажете 01-Jun-2006, то получите 52. Европейцы переходящую неделю относят к предыдущему году, а американцы к следующему.
Так что у американцев последняя неделя года может иметь номер 1.

Что выбрать - зависит от назначения программы.
всё правильно 1 января 1006 года это еще 52 неделя.
iw- это и есть европейская неделя
SELECT to_char(to_date('01-Jan-2004'),'iw') =01
SELECT to_char(to_date('01-Jan-2006'),'iw') =52

если основываться на 'iw', то можно так
Код: plaintext
1.
2.
3.
select min(t.dt), max(t.dt), to_char(t.dt,'iw') week from (
 select to_date('2004','yyyy')+rownum- 7  dt from all_objects where rownum <=  372 ) t
group by to_char(t.dt,'iw')
...
Рейтинг: 0 / 0
первый день недели
    #33510960
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
select trunc(to_date(yn,'yyyy')+wn* 7 ,'iw') d1 from (
  select  4  wn , 2006  yn from dual
)
...
Рейтинг: 0 / 0
первый день недели
    #33510968
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iV@n.....
если основываться на 'iw', то можно так
Код: plaintext
1.
2.
3.
select min(t.dt), max(t.dt), to_char(t.dt,'iw') week from (
 select to_date('2004','yyyy')+rownum- 7  dt from all_objects where rownum <=  372 ) t
group by to_char(t.dt,'iw')

спасибо, похоже то, что надо.
...
Рейтинг: 0 / 0
первый день недели
    #33511675
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
johanna iV@n.....
если основываться на 'iw', то можно так
Код: plaintext
1.
2.
3.
select min(t.dt), max(t.dt), to_char(t.dt,'iw') week from (
 select to_date('2004','yyyy')+rownum- 7  dt from all_objects where rownum <=  372 ) t
group by to_char(t.dt,'iw')

спасибо, похоже то, что надо.
нет, опять ошибка: 2004 год 52 неделя

все функции считают с ошибками :(
...
Рейтинг: 0 / 0
первый день недели
    #33511718
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
johanna..
нет, опять ошибка: 2004 год 52 неделя
все функции считают с ошибками :( ???
Код: plaintext
1.
2.
3.
select trunc(to_date(yn,'yyyy')+wn* 7 ,'iw') d1 from (
  select  4  wn , 2006  yn from dual
)
 27 . 12 . 2004 
...
Рейтинг: 0 / 0
первый день недели
    #33511761
iV@n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
johanna johanna iV@n.....
если основываться на 'iw', то можно так
Код: plaintext
1.
2.
3.
select min(t.dt), max(t.dt), to_char(t.dt,'iw') week from (
 select to_date('2004','yyyy')+rownum- 7  dt from all_objects where rownum <=  372 ) t
group by to_char(t.dt,'iw')

спасибо, похоже то, что надо.
нет, опять ошибка: 2004 год 52 неделя

все функции считают с ошибками :(
у orawsh'a вроде хороший запрос. но я и свой поправил
Код: plaintext
1.
2.
3.
select min(t.dt), max(t.dt), to_char(t.dt,'yyyy') year, to_char(t.dt,'iw') week from (
 select to_date('2004','yyyy')+rownum- 7  dt from all_objects where rownum <=  372 ) t
group by to_char(t.dt,'yyyy'), to_char(t.dt,'iw')
...
Рейтинг: 0 / 0
первый день недели
    #33511763
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orawish johanna..
нет, опять ошибка: 2004 год 52 неделя
все функции считают с ошибками :( ???
Код: plaintext
1.
2.
3.
select trunc(to_date(yn,'yyyy')+wn* 7 ,'iw') d1 from (
  select  4  wn , 2006  yn from dual
)
 27 . 12 . 2004 

1 я неделя 2004 начинается не 5 января
...
Рейтинг: 0 / 0
первый день недели
    #33511770
iV@n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iV@n
Код: plaintext
1.
2.
3.
select min(t.dt), max(t.dt), to_char(t.dt,'yyyy') year, to_char(t.dt,'iw') week from (
 select to_date('2004','yyyy')+rownum- 7  dt from all_objects where rownum <=  372 ) t
group by to_char(t.dt,'yyyy'), to_char(t.dt,'iw')

тут тоже неправильно в общем случае...
...
Рейтинг: 0 / 0
первый день недели
    #33511783
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
johanna orawish johanna..
нет, опять ошибка: 2004 год 52 неделя
все функции считают с ошибками :( ???
Код: plaintext
1.
2.
3.
select trunc(to_date(yn,'yyyy')+wn* 7 ,'iw') d1 from (
  select  4  wn , 2006  yn from dual
)
 27 . 12 . 2004 

1 я неделя 2004 начинается не 5 января
А когда?
johannaкак получить первый день недели, если известно какая это по счёту неделя и год?
т.е. 4 неделя 2006 год = 23.01.2006
Код: plaintext
1.
2.
3.
4.
5.
6.
select trunc(to_date(yn,'yyyy')+wn* 7 ,'iw') d1 from (
  select rownum wn , 2006  yn from tab where rownum< 5 
)
 02 . 01 . 2006 
 09 . 01 . 2006 
 16 . 01 . 2006 
 23 . 01 . 2006 
...
Рейтинг: 0 / 0
первый день недели
    #33511794
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orawish
А когда? ...
1-я изо неделя начинается
29.12.2003
...
Рейтинг: 0 / 0
первый день недели
    #33511806
Jannny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
johanna orawish
А когда? ...
1-я изо неделя начинается
29.12.2003
"Просто за время пути собака могла подрасти" ;) Условие задачи меняется во время ее выполнения - это обычная ситуация ;))
...
Рейтинг: 0 / 0
первый день недели
    #33511813
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тада так
Код: plaintext
1.
select trunc(to_date(yn,'yyyy'),'iw')+(wn- 1 )* 7  d1
from (select rownum wn , 2006  yn from tab where rownum< 5 )
...
Рейтинг: 0 / 0
первый день недели
    #33511815
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iw=изо неделя
...
Рейтинг: 0 / 0
первый день недели
    #33511826
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orawishтада так
Код: plaintext
1.
select trunc(to_date(yn,'yyyy'),'iw')+(wn- 1 )* 7  d1
from (select rownum wn , 2006  yn from tab where rownum< 5 )

в 2006 году iso-неделя начинается 2 января.
1-я изо неделя должна иметь минимум 4 дня, поэтому она может начинаться в прошлом году, как в 2004 году
...
Рейтинг: 0 / 0
первый день недели
    #33511842
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
johanna orawishтада так
Код: plaintext
1.
select trunc(to_date(yn,'yyyy'),'iw')+(wn- 1 )* 7  d1
from (select rownum wn , 2006  yn from tab where rownum< 5 )

в 2006 году iso-неделя начинается 2 января.
1-я изо неделя должна иметь минимум 4 дня, поэтому она может начинаться в прошлом году, как в 2004 году
типа этого, значит
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select 
 case when trunc(yd1,'iw')+  3  >= trunc(yd1,'yyyy') then
   trunc(yd1,'iw')+(wn- 1 )* 7 
 else
   trunc(yd1,'iw')+(wn)* 7 
 end d1
from 
  (select wn,to_date(yn,'yyyy') yd1 from
    (select rownum wn , 2006  yn from tab where rownum< 5 ))
...
Рейтинг: 0 / 0
первый день недели
    #33511854
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pan159Европейцы переходящую неделю относят к предыдущему году, а американцы к следующему.

Nonsense:

Calculating Week Numbers
The week numbers returned by the WW format mask are calculated according to the following algorithm: int(dayOfYear+6)/7. This algorithm does not follow the ISO standard (2015, 1992-06-15).

To support the ISO standard, the IW format element is provided. It returns the ISO week number. In addition, the I, IY, IYY, and IYYY format elements, equivalent in behavior to the Y, YY, YYY, and YYYY format elements, return the year relating to the ISO week number.

In the ISO standard, the year relating to an ISO week number can be different from the calendar year. For example, 1st Jan 1988 is in ISO week number 53 of 1987. A week always starts on a Monday and ends on a Sunday. The week number is determined according the following rules:

If January 1 falls on a Friday, Saturday, or Sunday, then the week including January 1 is the last week of the previous year, because most of the days in the week belong to the previous year.

If January 1 falls on a Monday, Tuesday, Wednesday, or Thursday, then the week is the first week of the new year, because most of the days in the week belong to the new year.


For example, January 1, 1991, is a Tuesday, so Monday, December 31, 1990, to Sunday, January 6, 1991, is in week 1. Thus, the ISO week number and year for December 31, 1990, is 1, 1991. To get the ISO week number, use the IW format mask for the week number and one of the IY formats for the year.

johanna1 я неделя 2004 начинается не 5 января

If we are talking about ISO standard, that is correct. January 1, 2004 was Thursday. Therefore, 1 я неделя 2004 начинается December 28, 2003. There is a simple way to calculate first day of the first week of a year in ISO format:

Код: plaintext
SELECT NEXT_DAY(TO_DATE('&YEAR','YYYY') -  4 ,'MONDAY') FROM dual

So in order to получить первый день недели, если известно какая это по счёту неделя и год you need:

Код: plaintext
SELECT NEXT_DAY(TO_DATE('&YEAR','YYYY') -  4 ,'MONDAY') + (&WEEK -  1 ) *  7  FROM dual

For example:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> SELECT NEXT_DAY(TO_DATE('&YEAR','YYYY') -  4 ,'MONDAY') + (&WEEK -  1 ) *  7  FROM dual;
Enter value for year:  2006 
Enter value for week:  4 
old    1 : SELECT NEXT_DAY(TO_DATE('&YEAR','YYYY') -  4 ,'MONDAY') + (&WEEK -  1 ) *  7  FROM dual
new    1 : SELECT NEXT_DAY(TO_DATE('2006','YYYY') -  4 ,'MONDAY') + ( 4  -  1 ) *  7  FROM dual

NEXT_DAY(
---------
 23 -JAN- 06 

SQL> 

SY.
...
Рейтинг: 0 / 0
первый день недели
    #33512738
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем спасибо, решили своими силами, и без зависимости от региональных настроек.
...
Рейтинг: 0 / 0
первый день недели
    #33519502
Фотография pan159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joanna,
еще раз обращаю внимание на контекст задачи. У меня был случай, когда в зависимости от контракта (с европейцами или американцами) номер недели вычислялся по-разному. Поэтому любой однозначный алгоритм давал бы ошибку в определении сроков доставки груза.
...
Рейтинг: 0 / 0
первый день недели
    #33520153
Фотография johanna
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pan159Joanna,
еще раз обращаю внимание на контекст задачи. У меня был случай, когда в зависимости от контракта (с европейцами или американцами) номер недели вычислялся по-разному. Поэтому любой однозначный алгоритм давал бы ошибку в определении сроков доставки груза.
спасибо :)
для этого я функцию написала, чтоб настройки не подвели
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
первый день недели
    #38809952
Vladimir Bolotin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

машина времени, да, но решал похожий вопрос и наткнулся на тему. :-)
Поэтому уж вставлю спои 5 копеек:

ИМХО
If we are talking about ISO standard, that is correct. January 1, 2004 was Thursday. Therefore, 1 я неделя 2004 начинается December 28, 2003. There is a simple way to calculate first day of the first week of a year in ISO format:
правильно будет так

Код: plsql
1.
SELECT NEXT_DAY(TRUNC(TO_DATE('&YEAR','YYYY'),'YEAR') - 4,'MONDAY') FROM dual;
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 2 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / первый день недели
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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