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

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

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

Код: plsql
1.
select d, to_char(d, 'w') from (select date '2019-12-31' + rownum d from dual connect by level < 11)
...
Рейтинг: 0 / 0
Дополнить таблицу дат до 2030года
    #39912090
Finswimmer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,
Датами, имеется ввиду продолжить таблицу до конца 2030года
...
Рейтинг: 0 / 0
Дополнить таблицу дат до 2030года
    #39912097
Finswimmer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверное не корректно выразил свои мысли. Слишком много лишнего написал
В таблице ST_CALENDAR первичным (от которой преобразуются все остальные поля) является DT_GID. Как продолжить таблицу дат по какого-то n-го значения.
...
Рейтинг: 0 / 0
Дополнить таблицу дат до 2030года
    #39912118
Oleg M.Ivanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Валяется шаблончик в виде шпаргалки:
Код: 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
Дополнить таблицу дат до 2030года
    #39912119
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Дополнить таблицу дат до 2030года
    #39912120
Finswimmer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oleg M.Ivanov,

Спасибо, сохраню себе шпаргалочку тоже
...
Рейтинг: 0 / 0
Дополнить таблицу дат до 2030года
    #39912134
Finswimmer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Преобразовав под себя запрос он не работает
Код: 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
Дополнить таблицу дат до 2030года
    #39912139
Oleg M.Ivanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну конечно такое работать не будет.

Чтобы продолжить заполнение таблицы, надо получить из нее максимальную дату и заполнить от нее остальные даты:
Код: 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
Дополнить таблицу дат до 2030года
    #39912148
Finswimmer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oleg M.Ivanov,

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

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

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

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

не верю :)
Покажи ( с ошибкой )
лучше через sql*plus
...
Рейтинг: 0 / 0
Дополнить таблицу дат до 2030года
    #39912292
Finswimmer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Дополнить таблицу дат до 2030года
    #39912303
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Finswimmer,

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

Ну я ж учусь, поэтому пытаюсь понять как правильно и пока это получается очень плохо
...
Рейтинг: 0 / 0
Дополнить таблицу дат до 2030года
    #39912308
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Дополнить таблицу дат до 2030года
    #39912318
Oleg M.Ivanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Дополнить таблицу дат до 2030года
    #39912320
Finswimmer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oleg M.Ivanov,

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

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


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