powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Из диапазона дат получить только вторники и четверги
3 сообщений из 3, страница 1 из 1
Из диапазона дат получить только вторники и четверги
    #40090850
Рустамка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, Форум!
Задача: Из диапазона дат (c 01 сентября по 31 мая) получить только те первые 10 дат, которые выпадают только на понедельник и среду.

Моё решение (не работает):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH dates(ddate) AS
(
    SELECT
          TO_DATE('01.09.2021', 'DD.MM.YYYY') + LEVEL AS ddate
    FROM DUAL
    CONNECT BY LEVEL <= TO_DATE('31.05.2022', 'DD.MM.YYYY') - TO_DATE('01.09.2021', 'DD.MM.YYYY')
)
    SELECT
            TO_CHAR(ddate, 'DD.MM.YYYY') as result_date
          , TO_CHAR(ddate, 'D') as dow
    FROM dates da
    WHERE TO_CHAR(ddate, 'D') in (SELECT * FROM TABLE(APEX_STRING.SPLIT('1:3', ':')))
      AND ROWNUM <= 10
    ORDER BY ddate ASC;


* В APEX_STRING.SPLIT передаётся значение параметра Popup LOV с разрешённым multiselect. Здесь же просто подставил значение из параметра.
Результат:
result_datedow06.09.2021113.09.2021120.09.2021127.09.2021104.10.2021111.10.2021118.10.2021125.10.2021101.11.2021108.11.20211
В результирующем наборе видно, что выдаются первые 10 понедельников, пропуская среды. Если уменьшить диапазон до месяца, то в таком случае выдаётся всё корректно, но тогда теряется универсальность (возможно нет) метода.
Вопрос: каким образом выводить ещё и среды?
Окружение:
Код: plsql
1.
SELECT BANNER FROM V$VERSION;


BANNEROracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Код: plsql
1.
SELECT * FROM apex_release;


VERSION_NOAPI_COMPATIBILITYPATCH_APPLIED20.2.0.00.202020.10.01APPLIED
*БД - ATP(Always free) в Oracle cloud
...
Рейтинг: 0 / 0
Из диапазона дат получить только вторники и четверги
    #40090859
Рустамка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Форум!
А ларчик просто открывался:
1. Отказаться от конструкции TABLE() в пользу прямой выборки из APEX_STRING.SPLIT()
2. Отказаться от конструкции IN() в пользу конструкции MEMBER OF
Итог:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH dates(ddate) AS
(
    SELECT
          TO_DATE('01.09.2021', 'DD.MM.YYYY') + LEVEL AS ddate
    FROM DUAL
    CONNECT BY LEVEL <= TO_DATE('31.05.2022', 'DD.MM.YYYY') - TO_DATE('01.09.2021', 'DD.MM.YYYY')
)
    SELECT
            TO_CHAR(ddate, 'DD.MM.YYYY') as result_date
          , TO_CHAR(ddate, 'D') as dow
    FROM dates da
    WHERE TO_CHAR(ddate, 'D') MEMBER OF APEX_STRING.SPLIT('1:3', ':')
      AND ROWNUM <= 10
    ORDER BY ddate ASC


Результат:
#RESULT_DATEDOW106.09.20211208.09.20213313.09.20211415.09.20213520.09.20211622.09.20213727.09.20211829.09.20213904.10.202111006.10.20213
Источник
Тык

P.S.: Очень хотел закрыть топик ответом - "Спасибо, разобрался сам!" (как здесь принято в большинстве постов), но все таки лучше прикладывать реализацию, даже если над ней думал несколько часов, а сразу после публикации вопроса пришло решение ;-)
...
Рейтинг: 0 / 0
Из диапазона дат получить только вторники и четверги
    #40093852
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рустамка
Очень хотел закрыть топик ответом - "Спасибо, разобрался сам!"
И правильно сделал, потому что как бы еще узнал, что на самом деле не разобрался и ничего не решил?

Вот тут ошибка:

Рустамка

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH dates(ddate) AS
(
    SELECT
          TO_DATE('01.09.2021', 'DD.MM.YYYY') + LEVEL AS ddate
    FROM DUAL
    CONNECT BY LEVEL <= TO_DATE('31.05.2022', 'DD.MM.YYYY') - TO_DATE('01.09.2021', 'DD.MM.YYYY')
)
    SELECT
            TO_CHAR(ddate, 'DD.MM.YYYY') as result_date
          , TO_CHAR(ddate, 'D') as dow
    FROM dates da
    WHERE TO_CHAR(ddate, 'D') MEMBER OF APEX_STRING.SPLIT('1:3', ':')
      AND ROWNUM <= 10
    ORDER BY ddate ASC


Оракл вычисляет роунумы ДО ордер бая. Это азы ваще-та. То, что решение работает - это случайная магия данных. Оно может перестать работать в любой момент абсолютно без какой-либо видимой причины.
И первое решение можно было починить, просто вынеся сортировку во внешний запрос. Или с помощью row_number. Или кучей других способов.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Из диапазона дат получить только вторники и четверги
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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