Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
Валерий Юринский
Member

Откуда: Москва, "ФОРС Дистрибуция"
Сообщений: 1234
Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц (4 балла)

Используя обращение только к таблице DUAL, построить SQL-запрос, возвращающий один столбец, содержащий календарь на текущий месяц текущего года:
- номер дня в месяце (две цифры),
- полное название месяца по-английски заглавными буквами (в верхнем регистре),
- год (четыре цифры),
- полное название дня недели по-английски строчными буквами (в нижнем регистре).

Каждое "подполе" должно быть отделено от следующего одним пробелом.

В результате не должно быть начальных и хвостовых пробелов.

Количество возвращаемых строк должно точно соответствовать количеству дней в текущем месяце.

Строки должны быть упорядочены по номерам дней в месяце по возрастанию
19 янв 10, 13:44    [8208364]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
Добрый Э - Эх
Guest
Тынц - календарики на все вкусы...
19 янв 10, 13:47    [8208398]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
Валерий Юринский
Member

Откуда: Москва, "ФОРС Дистрибуция"
Сообщений: 1234
Уважаемые коллеги!

Публикуйте ваши варианты решения этого задания.

После того, как ваша фантазия иссякнет, я опубликую решения, предложенные участниками Oracle-Олимпиады 2009.
19 янв 10, 13:48    [8208406]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
Andrei Fomichev
Member

Откуда: Москва
Сообщений: 453
С какого дня начинается неделя - с понедельника, как в РФ, или с воскресенья, как в Америке ?
Допустимо ли выполнить перед запросом
alter session set NLS_DATE_LANGUAGE=American
или запрос должен быть независимым от текущих настроек сессии ?
19 янв 10, 13:55    [8208464]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
Добрый Э - Эх
Guest
Andrei Fomichev
С какого дня начинается неделя - с понедельника, как в РФ, или с воскресенья, как в Америке ?
Допустимо ли выполнить перед запросом
alter session set NLS_DATE_LANGUAGE=American
или запрос должен быть независимым от текущих настроек сессии ?
Исходная задача не подразумевает деление месяца на недели. А уж понедельник, он и в Африке понедельник, даже если неделя будет начинаться с четверга.
19 янв 10, 13:58    [8208506]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
Andrei Fomichev
Member

Откуда: Москва
Сообщений: 453
вот вариант, предполагающий, что английский язык даты и первый день недели уже установлены верными.
select trim(lpad(level,2,'0')||' '
  ||trim(upper(to_char(sysdate,'Month')))||' '
  ||to_char(sysdate,'YYYY')||' '
  ||lower(trim(to_char(trunc(sysdate,'MM')+level-1,'Day'))))
s from dual
connect by level <= to_number(to_char(last_day(trunc(sysdate)),'dd'))
order by s
19 янв 10, 13:59    [8208517]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
Валерий Юринский
Member

Откуда: Москва, "ФОРС Дистрибуция"
Сообщений: 1234
Andrei Fomichev
С какого дня начинается неделя - с понедельника, как в РФ, или с воскресенья, как в Америке ?
Какое это имеет значение для решения задания?

Andrei Fomichev
Допустимо ли выполнить перед запросом
alter session set NLS_DATE_LANGUAGE=American
Нет.

Andrei Fomichev
запрос должен быть независимым от текущих настроек сессии ?
См. задание.
19 янв 10, 13:59    [8208525]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
Валерий Юринский
Member

Откуда: Москва, "ФОРС Дистрибуция"
Сообщений: 1234
Andrei Fomichev
вот вариант, предполагающий, что английский язык даты и первый день недели уже установлены верными.
Результат верный. Но само решение получилось достаточно громоздким.
19 янв 10, 14:05    [8208571]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
Andrei Fomichev
Member

Откуда: Москва
Сообщений: 453
вот так мы не будем зависеть от настроек сессии
select trim(lpad(level,2,'0')||' '
  ||trim(upper(to_char(sysdate,'Month','NLS_DATE_LANGUAGE=AMERICAN')))||' '
  ||to_char(sysdate,'YYYY')||' '
  ||lower(trim(to_char(trunc(sysdate,'MM')+level-1,'Day','NLS_DATE_LANGUAGE=AMERICAN'))))
s from dual
connect by level <= to_number(to_char(last_day(trunc(sysdate)),'dd'))
order by s
19 янв 10, 14:07    [8208585]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2854
простенько как-то.
select to_char( dt, 'dd' )||' '||rtrim(to_char( dt, 'MONTH', 'NLS_DATE_LANGUAGE=American' ))||' '||
       to_char( dt, 'yyyy' )||' '||rtrim(to_char( dt, 'day', 'NLS_DATE_LANGUAGE=American' )) dt
  from (
select dt + rownum dt from ( 
       select add_months( last_day( trunc( sysdate ) ), -1 ) dt, to_char( last_day( trunc( sysdate ) ), 'dd' ) dm from dual 
          ) connect by rownum <= dm
       ) order by dt;
19 янв 10, 14:10    [8208612]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
select to_char(trunc(sysdate + 40, 'MM') + rownum - 1, 'DD MONTH YYYY day','NLS_DATE_LANGUAGE=American') from
(select 1 from dual group by cube(1,1,1,1,1))
 where rownum <= last_day(sysdate + 40) - trunc(sysdate + 40, 'MM') + 1
19 янв 10, 14:22    [8208711]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
SQLap,

ой-ёй +40 надо убрать
19 янв 10, 14:23    [8208716]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2854
Валерий Юринский
Andrei Fomichev
вот вариант, предполагающий, что английский язык даты и первый день недели уже установлены верными.
Результат верный. Но само решение получилось достаточно громоздким.


В задаче версия БД не означена. Если она будет меньше 10, то хотелось бы посмотреть на минимизацию.
19 янв 10, 14:24    [8208732]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
Валерий Юринский
Member

Откуда: Москва, "ФОРС Дистрибуция"
Сообщений: 1234
Andrei Fomichev
вот так мы не будем зависеть от настроек сессии
То же самое, что раньше, но с NLS_DATE_LANGUAGE
19 янв 10, 14:25    [8208742]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
Валерий Юринский
Member

Откуда: Москва, "ФОРС Дистрибуция"
Сообщений: 1234
AlexFF__|
В задаче версия БД не означена.
Версия Oracle Database 10.2.0.4
19 янв 10, 14:27    [8208761]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2854
Валерий Юринский
AlexFF__|
В задаче версия БД не означена.
Версия Oracle Database 10.2.0.4


select regexp_replace(rtrim(to_char(dt, 'dd MONTH yyyy day', 'NLS_DATE_LANGUAGE=American')), '( ){2,}', ' ') dt
from (
select add_months(dt, -1) + rownum dt from (
select last_day(sysdate) dt from dual
) connect by rownum <= extract(day from dt)
) order by dt;
19 янв 10, 14:28    [8208776]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
with t as (select trunc(sysdate,'mm')+level-1 d 
             from dual connect by level <= to_char(last_day(sysdate),'dd'))
select to_char(d,'dd fmMONTH yyyy day','NLS_DATE_LANGUAGE=AMERICAN') d
  from t order by 1;
19 янв 10, 14:31    [8208805]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
Валерий Юринский
AlexFF__|
В задаче версия БД не означена.
Версия Oracle Database 10.2.0.4


моя версия прокатывает и на 8.1.7. Другое дело, что функция LAST_DAY и в 10-ке оказывается не ловит 29 февраля, вот незадача
19 янв 10, 14:31    [8208806]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
Валерий Юринский
Member

Откуда: Москва, "ФОРС Дистрибуция"
Сообщений: 1234
AlexFF__|
простенько как-то.
select to_char( dt, 'dd' )||' '||rtrim(to_char( dt, 'MONTH', 'NLS_DATE_LANGUAGE=American' ))||' '||
       to_char( dt, 'yyyy' )||' '||rtrim(to_char( dt, 'day', 'NLS_DATE_LANGUAGE=American' )) dt
  from (
select dt + rownum dt from ( 
       select add_months( last_day( trunc( sysdate ) ), -1 ) dt, to_char( last_day( trunc( sysdate ) ), 'dd' ) dm from dual 
          ) connect by rownum <= dm
       ) order by dt;
Что-то совсем не "простенько", а "запутаненько как-то",
особенно во фразе FROM
Результат получается верный.
19 янв 10, 14:32    [8208811]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
Валерий Юринский
Member

Откуда: Москва, "ФОРС Дистрибуция"
Сообщений: 1234
SQLap
функция LAST_DAY и в 10-ке оказывается не ловит 29 февраля, вот незадача
Да ну!? И в каком же году вы с её помощью пытаетесь это ловить? :-)))
19 янв 10, 14:36    [8208857]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
или

select to_char(trunc(sysdate,'mm')+level-1
              ,'dd fmMONTH yyyy day','NLS_DATE_LANGUAGE=AMERICAN') d 
  from dual connect by level <= to_char(last_day(sysdate),'dd');
19 янв 10, 14:38    [8208875]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
Валерий Юринский,

да, все верно, погрешил я на него, каюсь)
19 янв 10, 14:42    [8208909]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
CV
Member

Откуда:
Сообщений: 56
orawish
или

select to_char(trunc(sysdate,'mm')+level-1
              ,'dd fmMONTH yyyy day','NLS_DATE_LANGUAGE=AMERICAN') d 
  from dual connect by level <= to_char(last_day(sysdate),'dd');



Чисто для интереса:-)
SQL> 
SQL> select to_char(trunc(sysdate,'mm')+level-1
  2                ,'dd fmMONTH yyyy day','NLS_DATE_LANGUAGE=AMERICAN') d
  3    from dual connect by level <= to_char(last_day(sysdate),'dd');
 
D
----------------------------
11 DEI 1388 friday
12 DEI 1388 saturday
13 DEI 1388 sunday
14 DEI 1388 monday
15 DEI 1388 tuesday
16 DEI 1388 wednesday
17 DEI 1388 thursday
18 DEI 1388 friday
19 DEI 1388 saturday
20 DEI 1388 sunday
21 DEI 1388 monday
22 DEI 1388 tuesday
23 DEI 1388 wednesday
24 DEI 1388 thursday
25 DEI 1388 friday
26 DEI 1388 saturday
27 DEI 1388 sunday
28 DEI 1388 monday
29 DEI 1388 tuesday
30 DEI 1388 wednesday
 
D
----------------------------
01 BAHMAN 1388 thursday
02 BAHMAN 1388 friday
03 BAHMAN 1388 saturday
04 BAHMAN 1388 sunday
05 BAHMAN 1388 monday
06 BAHMAN 1388 tuesday
07 BAHMAN 1388 wednesday
08 BAHMAN 1388 thursday
09 BAHMAN 1388 friday
10 BAHMAN 1388 saturday
 
30 rows selected
 
SQL> 
19 янв 10, 14:48    [8208980]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
Валерий Юринский
Member

Откуда: Москва, "ФОРС Дистрибуция"
Сообщений: 1234
orawish

...
или
...
Оба решения верны, лаконичны и очень близки к предполагаемому.
19 янв 10, 14:49    [8208995]     Ответить | Цитировать Сообщить модератору
 Re: Oracle-Олимпиада 2009. Задание 6. Календарь на текущий месяц  [new]
Валерий Юринский
Member

Откуда: Москва, "ФОРС Дистрибуция"
Сообщений: 1234
AlexFF__|

select regexp_replace(rtrim(to_char(dt, 'dd MONTH yyyy day', 'NLS_DATE_LANGUAGE=American')), '( ){2,}', ' ') dt
  from (
     select add_months(dt, -1) + rownum dt from ( 
                 select last_day(sysdate) dt from dual 
                       ) connect by rownum <= extract(day from dt)
       ) order by dt;
Результат получается верный.
Незнание модификатора FM в формате преобразования дат заставляет использовать regexp_replace.
19 янв 10, 15:06    [8209139]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Oracle Ответить