powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Дни недели для расписания
9 сообщений из 9, страница 1 из 1
Дни недели для расписания
    #40055592
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Как лучше реализовать такой код:

Есть человек, у него тренинги три раза в неделю. Скажем понедельник, среда, пятница.

Нужно заполнить ниже таблицу с датами его тренинга до конца года начиная с сегодняшнего дня (Пн, Ср, Пт).

Код: plsql
1.
2.
3.
4.
CREATE TABLE trainingSchedule (
    id NUMBER,
    training_date DATE
);
...
Рейтинг: 0 / 0
Дни недели для расписания
    #40055595
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Дни недели для расписания
    #40055606
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
Вот что получилось:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
DECLARE
  start_date NUMBER;
  end_date NUMBER;
  training_date DATE;
  day_of_week NUMBER;
  training_id NUMBER := 1;
BEGIN

  start_date := TO_NUMBER(TO_CHAR(TO_DATE(sysdate, 'dd.MM.yy'), 'j'));
  end_date := TO_NUMBER(TO_CHAR(TO_DATE('31.12.2021', 'dd.MM.yy'), 'j'));
  
  FOR selected_date IN start_date..end_date LOOP
    training_date := TO_CHAR(TO_DATE(selected_date, 'j'), 'dd.MM.yy');
    SELECT TO_CHAR(training_date, 'D') INTO day_of_week FROM DUAL;
    IF (day_of_week IN (1, 3, 5)) THEN
        BEGIN
            INSERT INTO trainingSchedule VALUES(training_id, training_date);
            SELECT max(id) INTO training_id FROM trainingSchedule;
            training_id := training_id + 1;
        END;
    END IF;
  END LOOP;
END;
...
Рейтинг: 0 / 0
Дни недели для расписания
    #40055608
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid
Код: plsql
1.
TO_CHAR(training_date, 'D')

NLS-зависимый говнокод. RTFM iw
LiQuid
Код: plsql
1.
SELECT max(id) INTO training_id FROM trainingSchedule;

RTFM returning

P.S. Именование переменных так же, как и столбцов, рано или поздно больно ударит.
...
Рейтинг: 0 / 0
Дни недели для расписания
    #40055609
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Покажите NLS не зависимый НЕ говнокод, сударь.
...
Рейтинг: 0 / 0
Дни недели для расписания
    #40055617
exciter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
insert into trainingSchedule 
select rownum, dt from
(
select trunc(sysdate)+level-1 as dt from dual
connect by trunc(sysdate)+level-1 <= add_months(trunc(sysdate,'YYYY'),12)-1
)
where dt-TRUNC(dt, 'iw') in (0,2,4)
...
Рейтинг: 0 / 0
Дни недели для расписания
    #40055642
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exciter,
Спасибо.
В вашем коде можно проверить дата в таблице уже существует или нет?
Если существует, то не вставлять дату, если не существует, то вставить?
...
Рейтинг: 0 / 0
Дни недели для расписания
    #40055644
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid
Если существует, то не вставлять дату, если не существует, то вставить?
RTFM merge
...
Рейтинг: 0 / 0
Дни недели для расписания
    #40055651
exciter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LiQuid
Если существует, то не вставлять дату, если не существует, то вставить?

предполагая, что следующий вопрос может быть об уникальности поля id:
Код: plsql
1.
2.
3.
4.
CREATE TABLE trainingSchedule (
    id NUMBER GENERATED ALWAYS AS IDENTITY,
    training_date DATE UNIQUE
);


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
MERGE INTO trainingSchedule ts
USING (select dt
         from (select trunc(sysdate) + level - 1 as dt
                 from dual
               connect by trunc(sysdate) + level - 1 <=
                          add_months(trunc(sysdate, 'YYYY'), 12) - 1)
        where dt - TRUNC(dt, 'iw') in (0, 2, 4)) tmp
ON (ts.training_date = tmp.dt)
WHEN NOT MATCHED THEN
  INSERT (ts.training_date) VALUES (tmp.dt);

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


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