Oracle 11g посчитайте сколько понедельников и четвергов с даты начала до настоящего времени - PullRequest
0 голосов
/ 31 мая 2018

В Oracle я хотел бы создать запрос, который подсчитывает, сколько понедельников и четвергов прошло с начальной даты, считая оба вместе.

Например:

с 20 мая 18 до сегодня (четверг 31 мая 18)

Тамбыло общее число 4 понедельника и четверга (2 понедельника и 2 четверга) прошло с 20 мая до сегодняшнего дня.Я хочу 4 в ответ на этот запрос.Если этот запрос выполнялся вчера (среда, 30 мая-18), я хочу получить 3 счета.

Я думаю вычесть недели из сегодня минус 20-МАЯ-18

Может быть что-то вроде этого:

select ( TRUNC( SYSDATE, 'IW' ) - TRUNC( TO_DATE('20-MAY-18'), 'IW' ) ) / 7 * 2 from dual;

Я умножаю это на два из-за понедельника и четверга.Если четверг еще не наступил, то из-за этой недели он дает неверный результат.

Я не могу подсчитать, сколько дней недели, прошедших после этой недели, умножить на количество недель.

Мне нужно иметь возможность также изменять выбранные дни и не зацикливаться только на них.Понедельник и четверг

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Может быть, это поможет.Вы можете добавить больше логики к нему.Я не уверен, почему это должно возвратить 3, если бежал 30 мая.Что он задумал?Ваши даты начала / окончания одинаковы, и количество дней между ними также одинаково, независимо от того, когда вы его запускаете.Что должно произойти, если его прогон 30 мая?

WITH mon_thur AS
(
SELECT to_date('20-MAY-2018') + LEVEL-1 start_date
     , to_date('31-MAY-2018') end_date
     , to_date('31-MAY-2018') - to_date('20-MAY-2018') days_between
 FROM dual
CONNECT BY LEVEL <= to_date('31-MAY-2018') - to_date('20-MAY-2018')+1  -- days_between+1
)
SELECT count(*) number_of_mon_thu FROM
(
SELECT start_date, to_char(start_date, 'D') d_date 
  FROM mon_thur
)
WHERE d_date IN (2, 4)
/

Вывод 4. Вы можете заменить формат 'D' на 'DY' и заменить 2, 4 на WHERE d_date IN ('MON', 'ЧГ ').

0 голосов
/ 31 мая 2018

Вы можете использовать это для вычисления значения:

Рассчитать количество полных дней между понедельником недели, содержащим дату начала, и понедельником этой недели:

( TRUNC( SYSDATE, 'IW' ) - TRUNC( start_date, 'IW' ) )

Разделите его на 7, чтобы получить количество полных недель:

 / 7

Умножьте его на количество дней, которое вы хотите сопоставить в неделю

* 2

Затем настройте его, чтобы убрать понедельники.и четверги, которые были посчитаны до даты начала.Это корректировка 0, если днем ​​начала является понедельник, 1 для вторника-четверга и 2 для пятницы-воскресенья:

- DECODE( TRUNC( start_date ) - TRUNC( start_date, 'IW' ),
          0, 0, -- Monday
          1, 1, -- Tuesday
          2, 1, -- Wednesday
          3, 1, -- Thursday
          4, 2, -- Friday
          5, 2, -- Saturday
          6, 2  -- Sunday
        )

Затем отрегулируйте его, чтобы включить дни с понедельника этой текущей недели до сегодняшнего дня:

+ DECODE( TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' ),
          0, 1, -- Monday
          1, 1, -- Tuesday
          2, 1, -- Wednesday
          3, 2, -- Thursday
          4, 2, -- Friday
          5, 2, -- Saturday
          6, 2  -- Sunday
        )

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE table_name ( start_date ) AS
SELECT DATE '2018-05-20' + LEVEL - 1
FROM DUAL
CONNECT BY DATE '2018-05-20' + LEVEL - 1 <= SYSDATE;

Запрос 1 :

SELECT start_date,
       TO_CHAR( start_date, 'DY' ) As day,
       ( TRUNC( SYSDATE, 'IW' ) - TRUNC( start_date, 'IW' ) ) / 7 * 2
       - DECODE( TRUNC( start_date ) - TRUNC( start_date, 'IW' ),
                0, 0, 1, 1, 2, 1, 3, 1, 4, 2, 5, 2, 6, 2 )
       + DECODE( TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' ),
                0, 1, 1, 1, 2, 1, 3, 2, 4, 2, 5, 2, 6, 2 ) AS num_mon_and_thurs
FROM   table_name

Результаты :

|           START_DATE | DAY | NUM_MON_AND_THURS |
|----------------------|-----|-------------------|
| 2018-05-20T00:00:00Z | SUN |                 4 |
| 2018-05-21T00:00:00Z | MON |                 4 |
| 2018-05-22T00:00:00Z | TUE |                 3 |
| 2018-05-23T00:00:00Z | WED |                 3 |
| 2018-05-24T00:00:00Z | THU |                 3 |
| 2018-05-25T00:00:00Z | FRI |                 2 |
| 2018-05-26T00:00:00Z | SAT |                 2 |
| 2018-05-27T00:00:00Z | SUN |                 2 |
| 2018-05-28T00:00:00Z | MON |                 2 |
| 2018-05-29T00:00:00Z | TUE |                 1 |
| 2018-05-30T00:00:00Z | WED |                 1 |
| 2018-05-31T00:00:00Z | THU |                 1 |

Что если я хочу изменить его вместо понедельника и четверга набыть вторник, среда, суббота?Как мне это сделать?

SELECT start_date,
       TO_CHAR( start_date, 'DY' ) As day,
       ( TRUNC( SYSDATE, 'IW' ) - TRUNC( start_date, 'IW' ) ) / 7 * 3
       - DECODE( TRUNC( start_date ) - TRUNC( start_date, 'IW' ),
                0, 0, 1, 0, 2, 1, 3, 2, 4, 2, 5, 2, 6, 3 )
       + DECODE( TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' ),
                0, 0, 1, 1, 2, 2, 3, 2, 4, 2, 5, 3, 6, 3 ) AS num_tue_wed_sat
FROM   table_name;

SQLFIDDLE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...