Немного расширив то, что @Ted показал для одной фиксированной даты, чтобы включить квартал в запрос, который вы сделаете:
SELECT
n AS Date_ID,
TO_DATE('31/12/1995','DD/MM/YYYY') + NUMTODSINTERVAL(n,'day') AS Full_Date,
TO_CHAR(TO_DATE('31/12/1995','DD/MM/YYYY') + NUMTODSINTERVAL(n,'day'),'DD') AS Days,
TO_CHAR(TO_DATE('31/12/1995','DD/MM/YYYY') + NUMTODSINTERVAL(n,'day'),'MM') AS Month_Num,
TO_CHAR(TO_DATE('31/12/1995','DD/MM/YYYY') + NUMTODSINTERVAL(n,'day'),'Month') AS Month,
TO_CHAR(TO_DATE('31/12/1995','DD/MM/YYYY') + NUMTODSINTERVAL(n,'day'),'YYYY') AS Year,
TO_CHAR(TO_DATE('31/12/1995','DD/MM/YYYY') + NUMTODSINTERVAL(n,'day'),'Q') AS Quarter
FROM (
select level n
from dual
connect by level <= 7018);
COMMIT
в вашем оригинале действует как таблицапсевдоним для встроенного представления, и поскольку он не упоминается и имеет запутанное имя, я удалил его.
Вы можете упростить задачу, выполнив манипуляцию с датой один раз внутри этого встроенного представления:
select date_id,
full_date as full_date,
to_char(full_date, 'DD') as days,
to_char(full_date, 'MM') as month_num,
to_char(full_date, 'Month') as month,
to_char(full_date, 'YYYY') as year,
to_char(full_date, 'Q') as quarter
from (
select level as date_id, date '1995-12-31' + level as full_date
from dual
connect by level <= 7018
);
db <> fiddle demo
Вы можете на самом деле хотеть квартал (и, возможно, год и даже день) в виде чисел, а не строк;в этом случае просто оберните их в вызов to_number()
.
Вы также должны знать, что использование элемента формата Month
дает название месяца на текущем языке сеанса, так что кто-то еще запускает его с другим NLSНастройки будут видеть разные названия месяцев.Если вы всегда хотите, чтобы они были на определенном языке, вы можете указать это как часть вызова to_char()
.
db <> fiddle demo с фиксированным языком и числовой четвертью.