Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / первый день недели / 25 сообщений из 60, страница 1 из 3
27.01.2006, 16:24
    #33508048
johanna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
как получить первый день недели, если известно какая это по счёту неделя и год?
т.е. 4 неделя 2006 год = 23.01.2006
...
Рейтинг: 0 / 0
27.01.2006, 16:36
    #33508082
Proteus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
Код: plaintext
1.
2.
3.
SELECT TRUNC(to_date('2006', 'yyyy') +  7  *  4 , 'day')
  FROM DUAL;

...
Рейтинг: 0 / 0
27.01.2006, 16:44
    #33508107
AlexOI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
select next_day(to_date('01012006', 'ddmmYYYY') + 3 * 7,'Понедельник') from dual

где 3 - число недель минус 1
...
Рейтинг: 0 / 0
27.01.2006, 16:51
    #33508130
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
2 Proteus & AlexOI
Потренируйтесь при nls_territory=america & nls_date_language=american соответственно :)
...
Рейтинг: 0 / 0
27.01.2006, 16:55
    #33508141
AlexOI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
to Elic

Я думаю несложно установить параметр в соответствии с существующим nls_date_language
...
Рейтинг: 0 / 0
27.01.2006, 16:56
    #33508144
johanna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
мне нужны первый и последний дни заданной недели года.

как получить?
...
Рейтинг: 0 / 0
27.01.2006, 16:58
    #33508150
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
AlexOIЯ думаю несложно установить параметр в соответствии с существующим nls_date_languageСложно. Код должен работать правильно независимо от NLS-окружения текущей сессии.
...
Рейтинг: 0 / 0
27.01.2006, 17:07
    #33508168
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
AlexOIЯ думаю несложно установить параметр в соответствии с существующим nls_date_language
После чего вызов "давно отлаженной и уже год как успешно работающей" процедуры вставляют в job, наступает конец периода, главбух вызывает к себе начальника ИТ отдела и подробно рассказывает ему, каким именно образом она вступит в противоестественную половую связь со всеми программистами разом, если все НЕМЕДЛЕННО НЕ БУДЕТ ИСПРАВЛЕНО.
...
Рейтинг: 0 / 0
27.01.2006, 17:12
    #33508178
iV@n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
johannaмне нужны первый и последний дни заданной недели года.

как получить?
а чем тебе этот вариант не нравится?
Код: plaintext
1.
2.
3.
select pivot.week, to_date('2006','yyyy') + (pivot.week- 1 )* 7  +  1  first_day,
 to_date('2006','yyyy') + (pivot.week- 1 )* 7  +  7  last_day
from dual, (select rownum week from all_objects where rownum <=  52 ) pivot
...
Рейтинг: 0 / 0
27.01.2006, 17:13
    #33508180
AlexOI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
Сама по себе задача устанавливает зависимость от nls параметров. Так как понятие "первый день недели" зависит от них. Так что решать ее независимо от текущих NLS параметров сессии - некорректно.
...
Рейтинг: 0 / 0
27.01.2006, 17:17
    #33508196
johanna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
iV@n johannaмне нужны первый и последний дни заданной недели года.

как получить?
а чем тебе этот вариант не нравится?
Код: plaintext
1.
2.
3.
select pivot.week, to_date('2006','yyyy') + (pivot.week- 1 )* 7  +  1  first_day,
 to_date('2006','yyyy') + (pivot.week- 1 )* 7  +  7  last_day
from dual, (select rownum week from all_objects where rownum <=  52 ) pivot

потому что для 2005 года получаются не корректные результаты
...
Рейтинг: 0 / 0
27.01.2006, 17:23
    #33508215
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
AlexOIСама по себе задача устанавливает зависимость от nls параметров. Так как понятие "первый день недели" зависит от них.У русских и иже с ними первый день недели - понедельник. Незавимо от того, что об этом думают буржуины и какие nls-параметры у текущей сессии.
...
Рейтинг: 0 / 0
27.01.2006, 17:27
    #33508226
AlexOI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
2 Elic

Вот и получи слово "Понедельник" на языке, соответсвующем NLS - параметрам сессии и подставляй как параметр. Пока еще никто не предложил решения, которое будет работать не анализируя или устанавлявая NLS параметры. Может такого решения и не существует.
...
Рейтинг: 0 / 0
27.01.2006, 17:29
    #33508235
Part
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
Идею для любого nls_lang можно предложить такую
Код: plaintext
1.
            (to_char(dat, 'DAY') = to_char(to_date( '23.01.2006', 'dd.mm.yyyy' ), 'DAY'))                 
, т.е нам просто известно, что 23.01.2006 понедельник
...
Рейтинг: 0 / 0
27.01.2006, 17:31
    #33508239
johanna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
PartИдею для любого nls_lang можно предложить такую
Код: plaintext
1.
            (to_char(dat, 'DAY') = to_char(to_date( '23.01.2006', 'dd.mm.yyyy' ), 'DAY'))                 
, т.е нам просто известно, что 23.01.2006 понедельник
а последний как? 29.01.2006
...
Рейтинг: 0 / 0
27.01.2006, 17:37
    #33508257
empty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
select trunc(trunc(sysdate,'yyyy')+decode(sign(trunc(sysdate,'yyyy')-trunc(trunc(sysdate,'yyyy'),'day')),1,7,0),'day')+(7*(4-1)) from dual

Где
trunc(sysdate,'yyyy') - год
4 - номер недели
а decode(sign(...) для нахождения полной первой недели
...
Рейтинг: 0 / 0
27.01.2006, 17:39
    #33508265
MaryCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
первый и последний дни 4й недели 2005 года
Код: plaintext
1.
2.
3.
4.
5.
select to_date('01.01.2005', 'dd.mm.yyyy') + 
        4 * 7  - to_char(to_date('01.01.2005', 'dd.mm.yyyy'), 'D') +  1 
       ,
       to_date('01.01.2005', 'dd.mm.yyyy') + 
        4 * 7  - to_char(to_date('01.01.2005', 'dd.mm.yyyy'), 'D') +  7 
  from dual
...
Рейтинг: 0 / 0
27.01.2006, 17:39
    #33508266
iV@n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
Код: plaintext
1.
2.
3.
4.
select pivot.week,
next_day(to_date('2005','yyyy') -  0 . 1 ,'monday') + (pivot.week- 1 )* 7   first_day,
next_day(to_date('2005','yyyy') -  0 . 1 ,'monday') + (pivot.week- 1 )* 7  +  6  last_day
from dual, (select rownum week from all_objects where rownum <=  52 ) pivot
...
Рейтинг: 0 / 0
27.01.2006, 17:44
    #33508272
MaryCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
Код: plaintext
1.
2.
3.
4.
5.
select trunc(sysdate,'yyyy') + 
        4 * 7  - to_char(trunc(sysdate,'yyyy'), 'D') +  1 
       ,
       trunc(sysdate,'yyyy') + 
        4 * 7  - to_char(trunc(sysdate,'yyyy'), 'D') +  7 
  from dual

Да, trunc надо было учесть...:/
...
Рейтинг: 0 / 0
27.01.2006, 17:46
    #33508277
johanna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
iV@n
Код: plaintext
1.
2.
3.
4.
select pivot.week,
next_day(to_date('2005','yyyy') -  0 . 1 ,'monday') + (pivot.week- 1 )* 7   first_day,
next_day(to_date('2005','yyyy') -  0 . 1 ,'monday') + (pivot.week- 1 )* 7  +  6  last_day
from dual, (select rownum week from all_objects where rownum <=  52 ) pivot

тогда выходит, что в 2004 году 1-я неделя начинается 05.01.2004
если же SELECT to_char(to_date('05-Jan-2004'),'iw') FROM dual, то выходит вторая неделя
...
Рейтинг: 0 / 0
27.01.2006, 17:49
    #33508284
Proteus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
Я что то совсем запутался...
В зависимости от региональной настройки должно ли менятся число в результате запроса ' дата начала 4-ой недели' или нет?

Если да то вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Connected to Oracle9i Enterprise Edition Release  9 . 2 . 0 . 4 . 0  
Connected as str
alter session set NLS_DATE_LANGUAGE = 'RUSSIAN';

Session altered
alter session set NLS_LANGUAGE = 'RUSSIAN';

Session altered
alter session set NLS_Territory = 'CIS';

Session altered
SELECT TRUNC(to_date('2006', 'yyyy') +  7  *  4 , 'day') field1,
to_char(TRUNC(to_date('2006', 'yyyy') +  7  *  4 , 'day'),'day ww dd.mm.yyyy') field2
FROM DUAL;

FIELD1      FIELD2
----------- -------------------------
 23 . 01 . 06     понедельник  04   23 . 01 . 2006 
alter session set NLS_DATE_LANGUAGE = 'AMERICAN';

Session altered
alter session set NLS_LANGUAGE = 'AMERICAN';

Session altered
alter session set NLS_Territory = 'AMERICA';

Session altered
SELECT TRUNC(to_date('2006', 'yyyy') +  7  *  4 , 'day') field1,
to_char(TRUNC(to_date('2006', 'yyyy') +  7  *  4 , 'day'),'day ww dd.mm.yyyy') field2
FROM DUAL;

FIELD1      FIELD2
----------- -----------------------
 29 . 01 . 06     sunday     05   29 . 01 . 2006 

SQL> 

Если же не должна то тогда встречный вопрос. А можно ли считать корректным приложение которое не реагирует на региональные настройки?
...
Рейтинг: 0 / 0
27.01.2006, 17:57
    #33508303
iV@n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
johanna iV@n
Код: plaintext
1.
2.
3.
4.
select pivot.week,
next_day(to_date('2005','yyyy') -  0 . 1 ,'monday') + (pivot.week- 1 )* 7   first_day,
next_day(to_date('2005','yyyy') -  0 . 1 ,'monday') + (pivot.week- 1 )* 7  +  6  last_day
from dual, (select rownum week from all_objects where rownum <=  52 ) pivot

тогда выходит, что в 2004 году 1-я неделя начинается 05.01.2004
если же SELECT to_char(to_date('05-Jan-2004'),'iw') FROM dual, то выходит вторая неделя
а что страного, что 1-я неделя 2004 года начинается 5?
имхо я бы не сказал, что 1-я неделя 2004 года начинается в 2003 году, хотя тогда получается, что последняя неделя 2003 года кончается в 2004 году, что тоже странновато.
нужно определиться что считать первой неделей года
...
Рейтинг: 0 / 0
27.01.2006, 18:02
    #33508314
johanna
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
iV@n
а что страного, что 1-я неделя 2004 года начинается 5?
имхо я бы не сказал, что 1-я неделя 2004 года начинается в 2003 году, хотя тогда получается, что последняя неделя 2003 года кончается в 2004 году, что тоже странновато.
нужно определиться что считать первой неделей года
определиться легко, первая неделя это результат этой функции
SELECT to_char(to_date('01-Jan-2004'),'iw') =01
...
Рейтинг: 0 / 0
27.01.2006, 18:03
    #33508315
scela
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
:YY - Год
:week - неделя

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT dt 
      ,dt-day_of_week   first_day_of_week
      ,dt-day_of_week+ 7  last_day_of_week
      ,day_of_week
  FROM ( 
       SELECT dt,point , DECODE( SIGN(md), - 1  ,md+ 8 , md+ 1 ) day_of_week /*День недели даты DT*/   
         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
27.01.2006, 18:08
    #33508331
scela
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
первый день недели
Правильно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT dt 
      ,dt-day_of_week   first_day_of_week
      ,dt-day_of_week+ 7  last_day_of_week
      ,day_of_week
  FROM ( 
       SELECT dt,point , DECODE( SIGN(md), - 1  ,md+ 7 , md) day_of_week /*День недели даты DT*/   
         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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / первый день недели / 25 сообщений из 60, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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