Выбор диапазона между двумя датами - PullRequest
0 голосов
/ 29 августа 2018

У меня есть Oracle 11g, и я хочу знать, можно ли сделать выбор от даты к другой дате.

Например: У меня есть два поля с именами StartDate и EndDate. Я хочу показать количество строк от EndDate до StartDate. Если мой StartDate равен 2018-08-01, а мой EndDate равен 2018-08-10, то моя ожидаемая таблица должна быть:

DATE       | rownum
2018-08-01 | 1
2018-08-02 | 2
2018-08-03 | 3
2018-08-04 | 4
2018-08-05 | 5
2018-08-06 | 6
2018-08-07 | 7
2018-08-08 | 8
2018-08-09 | 9
2018-08-10 | 10

Спасибо!

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Вы можете легко получить то, что хотите, используя sum(1) over (order by "date"):

select "Date", sum(1) over (order by "Date") "Row Number"
  from tab 
 where "Date" between date'2018-08-01' and date'2018-08-10';

Date         Row Number
----------   ----------       
2018-08-01          1
2018-08-02          2
2018-08-03          3
2018-08-04          4
2018-08-05          5
2018-08-06          6
2018-08-07          7
2018-08-08          8
2018-08-09          9
2018-08-10         10

Другие альтернативы count(1), row_number() также можно заменить на sum(1), также.

Демонстрация SQL Fiddle

0 голосов
/ 29 августа 2018

Полагаю, вы хотите что-то подобное ...

WITH my_table AS
    (SELECT     TRUNC(SYSDATE) + LEVEL - 1 AS current_day
     FROM       DUAL
     CONNECT BY LEVEL < 10)
SELECT FIRST_VALUE(current_day) OVER (ORDER BY current_day) first_day
     , current_day
     , current_day - FIRST_VALUE(current_day) OVER (ORDER BY current_day) days_diff
FROM   my_TABLE;

FIRST_DAY CURRENT_DAY  DAYS_DIFF
--------- ----------- ----------
29-AUG-18 29-AUG-18            0
29-AUG-18 30-AUG-18            1
29-AUG-18 31-AUG-18            2
29-AUG-18 01-SEP-18            3
29-AUG-18 02-SEP-18            4
29-AUG-18 03-SEP-18            5
29-AUG-18 04-SEP-18            6
29-AUG-18 05-SEP-18            7
29-AUG-18 06-SEP-18            8

9 rows selected.
0 голосов
/ 29 августа 2018

Вам может понадобиться генератор строк, подобный следующему:

select date '2018-08-01' + level -1 as yourDate,
       level as yourRowNum
from dual
connect by date '2018-08-01' + level -1 <= date '2018-08-10'

Результат:

YOURDATE   YOURROWNUM
---------- ----------
2018-08-01          1
2018-08-02          2
2018-08-03          3
2018-08-04          4
2018-08-05          5
2018-08-06          6
2018-08-07          7
2018-08-08          8
2018-08-09          9
2018-08-10         10

Чтобы избежать повторения значений даты, вы можете использовать:

with dateRange(startDate, endDate) as
(
    select date '2018-08-01', date '2018-08-10'
    from dual
)
select startDate + level -1 as yourDate,
       level as yourRowNum
from dateRange
connect by startDate + level -1 <= endDate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...