Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Дополнить таблицу дат до 2030года / 22 сообщений из 22, страница 1 из 1
09.01.2020, 15:39
    #39912076
Finswimmer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Добрый день!
Есть таблица дат 32поля. Дата короткая (31.12.21), дата длинная(31.12.2021), номер дня недели, название дня недели, номер месяца, название месяца, дата начала месяца, дата окончания месяца и т.д. в принципе все они производные от даты
Сейчас таблица заканчивается на дате 31.12.2021. Как дополнить таблицу до конца 2030 года?
...
Рейтинг: 0 / 0
09.01.2020, 15:43
    #39912081
iOracleDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Finswimmer,

Чей воспаленный мозг это соорудил?
...
Рейтинг: 0 / 0
09.01.2020, 15:47
    #39912085
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Finswimmer
Как дополнить таблицу до конца 2030 года?
Когда дедлайн понятно, осталось уточнить, чем дополнять.
...
Рейтинг: 0 / 0
09.01.2020, 15:48
    #39912086
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Это что называется "не ищите логики в учебных задачах"?

"Третьеклассник Вася выкурил три косяка, а Петя в три раза больше".

Код: plsql
1.
select d, to_char(d, 'w') from (select date '2019-12-31' + rownum d from dual connect by level < 11)
...
Рейтинг: 0 / 0
09.01.2020, 15:55
    #39912090
Finswimmer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
-2-,
Датами, имеется ввиду продолжить таблицу до конца 2030года
...
Рейтинг: 0 / 0
09.01.2020, 16:02
    #39912097
Finswimmer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Наверное не корректно выразил свои мысли. Слишком много лишнего написал
В таблице ST_CALENDAR первичным (от которой преобразуются все остальные поля) является DT_GID. Как продолжить таблицу дат по какого-то n-го значения.
...
Рейтинг: 0 / 0
09.01.2020, 16:37
    #39912118
Oleg M.Ivanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Валяется шаблончик в виде шпаргалки:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with t as (select trunc(sysdate) d from dual)
select 'ГОД - первый день' descr,trunc(d,'YY') new_date from t
union all
select 'ГОД - последний день', add_months(trunc(d,'YY'),12)-1 from t
union all
select 'КВАРТАЛ - первый день', trunc(d,'Q') from t
union all
select 'КВАРТАЛ - последний день', trunc(add_months(d, 3), 'Q')-1 from t
union all
select 'МЕСЯЦ - первый день' ,trunc(d,'MM') from t
union all
-- LAST_DAY не изменяет время
select 'МЕСЯЦ - последний день',last_day(d) from t 
union all
-- какой день недели считается первым, зависит от параметра NLS_TERRITORY
select 'НЕДЕЛЯ - первый день', trunc(d,'D') from t 
union all
select 'НЕДЕЛЯ - последний день', trunc(d,'D')+6 from t;



Ну а перебрать все даты до 2030 года можно так:

Код: plsql
1.
select trunc(sysdate+level-1) d from dual connect by level <= (select to_date('01/01/2030', 'DD/MM/YYYY') - trunc(sysdate) from dual);   
...
Рейтинг: 0 / 0
09.01.2020, 16:38
    #39912119
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Finswimmer
В таблице ST_CALENDAR

Код: plsql
1.
2.
3.
4.
5.
SQL> select * from ST_CALENDAR;
select * from ST_CALENDAR
ORA-00942: table or view does not exist

SQL> 
...
Рейтинг: 0 / 0
09.01.2020, 16:38
    #39912120
Finswimmer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Oleg M.Ivanov,

Спасибо, сохраню себе шпаргалочку тоже
...
Рейтинг: 0 / 0
09.01.2020, 17:16
    #39912134
Finswimmer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Преобразовав под себя запрос он не работает
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
          TRUNC(to_date('31/12/2021', 'DD/MM/YYYY')+level-1) d
FROM
          st_calendar 
          CONNECT BY level <=
          (SELECT to_date('01/01/2030', 'DD/MM/YYYY') - to_date('31/12/2021', 'DD/MM/YYYY') FROM st_calendar
          )
;
...
Рейтинг: 0 / 0
09.01.2020, 17:27
    #39912139
Oleg M.Ivanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Ну конечно такое работать не будет.

Чтобы продолжить заполнение таблицы, надо получить из нее максимальную дату и заполнить от нее остальные даты:
Код: plsql
1.
select trunc(sysdate+level-1) d from dual connect by level <= (select to_date('01/01/2030', 'DD/MM/YYYY') - (select max(DT_GID) from st_calendar) from dual); 
...
Рейтинг: 0 / 0
09.01.2020, 17:37
    #39912148
Finswimmer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Oleg M.Ivanov,

А почему в самом начале мы пишем trunc(sysdate+level-1), вопрос именно к sysdate? Это ведь системная дата?
И ошибка ORA-01427 "подзапрос одиночной строки возвращает более одной строки"
...
Рейтинг: 0 / 0
09.01.2020, 17:51
    #39912159
Oleg M.Ivanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Finswimmer
Oleg M.Ivanov,

А почему в самом начале мы пишем trunc(sysdate+level-1), вопрос именно к sysdate? Это ведь системная дата?

А, ну да, там тоже максимальную дату нужно вставить.
...
Рейтинг: 0 / 0
09.01.2020, 18:01
    #39912164
Finswimmer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Oleg M.Ivanov,

Теперь другая проблема. Не поддерживается использование фразы WITH. С чем это может быть связано?
...
Рейтинг: 0 / 0
09.01.2020, 18:22
    #39912176
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Finswimmer,

не верю :)
Покажи ( с ошибкой )
лучше через sql*plus
...
Рейтинг: 0 / 0
10.01.2020, 09:26
    #39912292
Finswimmer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Vadim Lejnin,

ORA-32034: не поддерживается использование фразы WITH
32034. 00000 - "unsupported use of WITH clause"
*Cause: Inproper use of WITH clause because one of the following two reasons
1. nesting of WITH clause within WITH clause not supported yet
2. For a set query, WITH clause can't be specified for a branch.
3. WITH clause cannot be specified within parenthesis.
*Action: correct query and retry
Error at Line: 49 Column: 2
...
Рейтинг: 0 / 0
10.01.2020, 09:40
    #39912303
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Finswimmer,

за это время быстрее было руками набить данные
...
Рейтинг: 0 / 0
10.01.2020, 09:52
    #39912307
Finswimmer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
123йй,

Ну я ж учусь, поэтому пытаюсь понять как правильно и пока это получается очень плохо
...
Рейтинг: 0 / 0
10.01.2020, 09:57
    #39912308
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Finswimmer
Не поддерживается использование фразы WITH. С чем это может быть связано?
Cвязано с одной из "two" причин
Finswimmer
Код: plaintext
1.
2.
3.
*Cause:    Inproper use of WITH clause because one of the following two reasons
           1. nesting of WITH clause within WITH clause not supported yet
           2. For a set query, WITH clause can't be specified for a branch.
           3. WITH clause cannot be specified within parenthesis.
...
Рейтинг: 0 / 0
10.01.2020, 10:15
    #39912318
Oleg M.Ivanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Finswimmer,

Ну не знаю, все прекрасно работает:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with t as (
select trunc(to_date('31/12/2021', 'DD/MM/YYYY')+level) d from dual connect by level <= (select to_date('01/01/2030', 'DD/MM/YYYY') - to_date('31/12/2021', 'DD/MM/YYYY') from dual) 
)
select d as "Короткая дата", 
mod(7 + to_number(to_char(d,'d')) -  to_number(to_char(to_date('03010001','ddmmyyyy'),'d')), 7)+1 "Номер дня недели",
decode(mod(7 + to_number(to_char(d,'d')) -  to_number(to_char(to_date('03010001','ddmmyyyy'),'d')), 7)+1,1,'Пн',2,'Вт',3,'Ср',4,'Чт',5,'Пт',6,'Сб',7,'Вс') "День недели",
to_char(d,'MM') "Месяц",
trunc(d,'MM') "Месяц(первый день)",
last_day(d) as "Месяц(последний день)",
trunc(d,'D') as "НЕДЕЛЯ - первый день",
trunc(d,'D')+6 "НЕДЕЛЯ - последний день" 
from t
;



Короткая датаНомер дня неделиДень неделиМесяцМесяц(первый день)Месяц(последний день)НЕДЕЛЯ - первый деньНЕДЕЛЯ - последний день01.01.20226Сб0101.01.202231.01.202226.12.202101.01.202202.01.20227Вс0101.01.202231.01.202202.01.202208.01.202203.01.20221Пн0101.01.202231.01.202202.01.202208.01.202204.01.20222Вт0101.01.202231.01.202202.01.202208.01.202205.01.20223Ср0101.01.202231.01.202202.01.202208.01.202206.01.20224Чт0101.01.202231.01.202202.01.202208.01.202207.01.20225Пт0101.01.202231.01.202202.01.202208.01.202208.01.20226Сб0101.01.202231.01.202202.01.202208.01.202209.01.20227Вс0101.01.202231.01.202209.01.202215.01.202210.01.20221Пн0101.01.202231.01.202209.01.202215.01.202211.01.20222Вт0101.01.202231.01.202209.01.202215.01.202212.01.20223Ср0101.01.202231.01.202209.01.202215.01.202213.01.20224Чт0101.01.202231.01.202209.01.202215.01.202214.01.20225Пт0101.01.202231.01.202209.01.202215.01.202215.01.20226Сб0101.01.202231.01.202209.01.202215.01.202216.01.20227Вс0101.01.202231.01.202216.01.202222.01.202217.01.20221Пн0101.01.202231.01.202216.01.202222.01.202218.01.20222Вт0101.01.202231.01.202216.01.202222.01.202219.01.20223Ср0101.01.202231.01.202216.01.202222.01.202220.01.20224Чт0101.01.202231.01.202216.01.202222.01.202221.01.20225Пт0101.01.202231.01.202216.01.202222.01.202222.01.20226Сб0101.01.202231.01.202216.01.202222.01.202223.01.20227Вс0101.01.202231.01.202223.01.202229.01.202224.01.20221Пн0101.01.202231.01.202223.01.202229.01.202225.01.20222Вт0101.01.202231.01.202223.01.202229.01.202226.01.20223Ср0101.01.202231.01.202223.01.202229.01.202227.01.20224Чт0101.01.202231.01.202223.01.202229.01.202228.01.20225Пт0101.01.202231.01.202223.01.202229.01.202229.01.20226Сб0101.01.202231.01.202223.01.202229.01.202230.01.20227Вс0101.01.202231.01.202230.01.202205.02.202231.01.20221Пн0101.01.202231.01.202230.01.202205.02.202201.02.20222Вт0201.02.202228.02.202230.01.202205.02.202202.02.20223Ср0201.02.202228.02.202230.01.202205.02.202203.02.20224Чт0201.02.202228.02.202230.01.202205.02.202204.02.20225Пт0201.02.202228.02.202230.01.202205.02.2022
....
...
Рейтинг: 0 / 0
10.01.2020, 10:20
    #39912320
Finswimmer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Oleg M.Ivanov,

Удивительно, если с копипастить то тоже все работает)))
...
Рейтинг: 0 / 0
10.01.2020, 11:47
    #39912349
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дополнить таблицу дат до 2030года
Finswimmer
дата начала месяца

Это как?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Дополнить таблицу дат до 2030года / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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