Нет никакой потребности использовать очень большие таблицы или таблицу ALL_OBJECTS:
SELECT TRUNC (SYSDATE - ROWNUM) dt
FROM DUAL CONNECT BY ROWNUM < 366
добьется цели.
Конкретная Oracle, и не полагается на существующие ранее большие таблицы или сложные системные представления по объектам словаря данных.
SELECT c1 from dual
MODEL DIMENSION BY (1 as rn) MEASURES (sysdate as c1)
RULES ITERATE (365)
(c1[ITERATION_NUMBER]=SYSDATE-ITERATION_NUMBER)
order by 1
Метод, вполне часто используемый в Oracle, является чем-то вроде этого:
select trunc(sysdate)-rn
from
( select rownum rn
from dual
connect by level <= 365)
/
Лично, если бы приложение имеет потребность в списке дат тогда, я просто составил бы таблицу с ними или составил бы таблицу с серией целых чисел до чего-то смешного как один миллион, который может использоваться для этого вида вещи.
Ahahaha, вот забавный способ, которым я просто придумал, чтобы сделать это:
select SYSDATE - ROWNUM
from shipment_weights sw
where ROWNUM < 365;
, где shipment_weights является любой большой таблицей;
Ради удовольствия вот некоторый код, который должен работать в SQL Server, Oracle или MySQL:
SELECT current_timestamp - CAST(d1.digit + d2.digit + d3.digit as int)
FROM
(
SELECT digit
FROM
(
select '1' as digit
union select '2'
union select '3'
union select '4'
union select '5'
union select '6'
union select '7'
union select '8'
union select '9'
union select '0'
) digits
) d1
CROSS JOIN
(
SELECT digit
FROM
(
select '1' as digit
union select '2'
union select '3'
union select '4'
union select '5'
union select '6'
union select '7'
union select '8'
union select '9'
union select '0'
) digits
) d2
CROSS JOIN
(
SELECT digit
FROM
(
select '1' as digit
union select '2'
union select '3'
union select '4'
union select '5'
union select '6'
union select '7'
union select '8'
union select '9'
union select '0'
) digits
) d3
WHERE CAST(d1.digit + d2.digit + d3.digit as int) < 365
ORDER BY d1.digit, d2.digit, d3.digit -- order not really needed here
Бонусные очки, если можно дать мне межплатформенный синтаксис, чтобы снова использовать таблицу цифр.
У меня нет ответа, чтобы снова использовать таблицу цифр, но вот пример кода, который будет работать, по крайней мере, в SQL-сервере и немного быстрее.
print("code sample");
select top 366 current_timestamp - row_number() over( order by l.A * r.A) as DateValue
from (
select 1 as A union
select 2 union
select 3 union
select 4 union
select 5 union
select 6 union
select 7 union
select 8 union
select 9 union
select 10 union
select 11 union
select 12 union
select 13 union
select 14 union
select 15 union
select 16 union
select 17 union
select 18 union
select 19 union
select 20 union
select 21
) l
cross join (
select 1 as A union
select 2 union
select 3 union
select 4 union
select 5 union
select 6 union
select 7 union
select 8 union
select 9 union
select 10 union
select 11 union
select 12 union
select 13 union
select 14 union
select 15 union
select 16 union
select 17 union
select 18
) r
print("code sample");
Опоздал примерно на полтора года, но для потомков вот версия для Teradata:
SELECT calendar_date
FROM SYS_CALENDAR.Calendar
WHERE SYS_CALENDAR.Calendar.calendar_date between '2010-01-01' (date) and '2010-01-03' (date)