2015-07-16 3 views
1

Я пытаюсь получить запрос без параметров, чтобы получить список дат с текущего месяца.Как получить все даты из месяца sysdate с Oracle SQL?

Что-то вроде этого:

SYSDATE = 16/07/15

Я хочу, чтобы следующий список:

01/07/15
02/07/15
...
30/07/15
3 1/07/15

+0

Что вы имеете в виду? Пожалуйста, будьте конкретны. – OldProgrammer

+1

@OldProgrammer Например, запуск указанного запроса прямо сейчас вернет все 31 день июля. – GriffeyDog

ответ

1

Вот что я должен работать:

SELECT TRUNC(SYSDATE, 'MM') + LEVEL - 1 AS day 
FROM dual 
CONNECT BY TRUNC(TRUNC(SYSDATE, 'MM') + LEVEL - 1, 'MM') = TRUNC(SYSDATE, 'MM') 
; 

Ключ в этом запросе - TRUNC(SYSDATE, 'MONTH'), который является первым днем ​​текущего месяц.
Мы используем иерархические запросы, чтобы добавлять один день в первый день месяца, пока значение больше не будет в текущем месяце.
Мы используем LEVEL - 1, потому что LEVEL начинается с 1, и нам нужно, чтобы оно начиналось с нуля.

Вот псевдо-запрос для того, что делает приведенный выше запрос:

SELECT (start_of_month + days) AS day 
FROM dual 
WHILE MONTH_OF(start_of_month + days) = current_month 

Этот запрос будет немного легче понять:

SELECT * 
FROM 
(
    SELECT TRUNC(SYSDATE, 'MM') + LEVEL - 1 AS day 
    FROM dual 
    CONNECT BY LEVEL <= 32 
) 
WHERE EXTRACT(MONTH FROM day) = EXTRACT(MONTH FROM SYSDATE) 
0

Это должно работать:

select trunc(sysdate, 'MONTH') + rownum - 1 
     from dual 
connect by rownum <= to_number(to_char(last_day(sysdate), 'DD')); 
1

Selects все дни за текущий месяц

SELECT TO_CHAR (TRUNC (SYSDATE, 'MM'), 'YYYYMMDD')+(LEVEL - 1) each_date 
FROM DUAL a 
CONNECT BY LEVEL < (TO_NUMBER (TO_CHAR (TRUNC (SYSDATE, 'MM') - 1, 'DD'))+1) 
0

Это трюк, с помощью подключения по. Я усекаю дату на уровне месяца, эффективно устанавливая ее на 1-й день месяца, добавляя день для каждого «уровня», а затем фильтрую для любого дня, который происходит за пределами месяца.

select day_of_month 
from 
(select (level - 1) + trunc(to_date('07/16/2015','MM/DD/YYYY'),'MM') day_of_month 
from 
dual 
connect by level <= 31) 
where day_of_month < add_months(trunc(to_date('07/16/2015','MM/DD/YYYY'),'MM'),1); 
Смежные вопросы