Вы можете использовать:
SQL Fiddle
Запрос 1 :
SELECT NEXT_DAY( DATE '2018-04-01' - 1, 'SUNDAY' ) + ( LEVEL - 1 ) * 7
AS startdate
FROM DUAL
CONNECT BY
NEXT_DAY( DATE '2018-04-01' - 1, 'SUNDAY' ) + ( LEVEL - 1 ) * 7
<= DATE '2018-06-30'
Результаты :
| STARTDATE |
|----------------------|
| 2018-04-01T00:00:00Z |
| 2018-04-08T00:00:00Z |
| 2018-04-15T00:00:00Z |
| 2018-04-22T00:00:00Z |
| 2018-04-29T00:00:00Z |
| 2018-05-06T00:00:00Z |
| 2018-05-13T00:00:00Z |
| 2018-05-20T00:00:00Z |
| 2018-05-27T00:00:00Z |
| 2018-06-03T00:00:00Z |
| 2018-06-10T00:00:00Z |
| 2018-06-17T00:00:00Z |
| 2018-06-24T00:00:00Z |
Всегда ли эта конструкция возвращает хотя бы одну строку? Если я добавлю дополнительное условие, что NEXT_DAY( DATE '2018-07-01' - 1, 'SUNDAY' ) + ( LEVEL - 1 ) * 7
должно быть меньше SYSDATE
, оно все равно возвращает первую строку, которая больше SYSDATE
.
Да, иерархический запрос всегда будет возвращать одну строку, если фильтрация только что выполнена в предложении CONNECT BY
(так как он будет проверять его только тогда, когда он пытается соединить одну строку со своим родителем и ему нужно сгенерировать хотя бы одну родитель, первым делающий это):
SELECT NEXT_DAY( DATE '2018-07-01' - 1, 'SUNDAY' ) + ( LEVEL - 1 ) * 7
AS startdate
FROM DUAL
CONNECT BY
NEXT_DAY( DATE '2018-07-01' - 1, 'SUNDAY' ) + ( LEVEL - 1 ) * 7
<= LEAST(
SYSDATE, -- DATE '2018-06-29'
DATE '2018-07-30'
)
Результаты
| STARTDATE |
|----------------------|
| 2018-07-01T00:00:00Z | -- Greater than SYSDATE
Но если вы добавите предложение WHERE
(вместо фильтрации в предложении CONNECT BY
), то он может вернуть ноль строк:
SELECT NEXT_DAY( DATE '2018-07-01' - 1, 'SUNDAY' ) + ( LEVEL - 1 ) * 7
AS startdate
FROM DUAL
WHERE NEXT_DAY( DATE '2018-07-01' - 1, 'SUNDAY' ) + ( LEVEL - 1 ) * 7
<= SYSDATE
CONNECT BY
NEXT_DAY( DATE '2018-07-01' - 1, 'SUNDAY' ) + ( LEVEL - 1 ) * 7
<= DATE '2018-07-30'
Результаты
No data found.