Создать представление за 365 дней - PullRequest
4 голосов
/ 16 декабря 2011

Как создать View со всеми днями в году. view заполняется датами с 01 января по 31 декабря. Как я могу сделать это в Oracle?

Если в текущем году 365 дней, в view должно быть 365 строк с датами. если в текущем году 366 дней, в view должно быть 366 строк с датами. Я хочу, чтобы у view был один столбец типа DATE.

Ответы [ 3 ]

11 голосов
/ 16 декабря 2011

Это простое представление сделает это:

create or replace view year_days as
select trunc(sysdate, 'YYYY') + (level-1) as the_day
from dual
connect by level <= to_number(to_char(last_day(add_months(trunc(sysdate, 'YYYY'),11)), 'DDD'))
/

Как это:

SQL> select * from year_days;

THE_DAY
---------
01-JAN-11
02-JAN-11
03-JAN-11
04-JAN-11
05-JAN-11
06-JAN-11
07-JAN-11
08-JAN-11
09-JAN-11
10-JAN-11
11-JAN-11

...

20-DEC-11
21-DEC-11
22-DEC-11
23-DEC-11
24-DEC-11
25-DEC-11
26-DEC-11
27-DEC-11
28-DEC-11
29-DEC-11
30-DEC-11
31-DEC-11

365 rows selected.

SQL> 

Дата генерируется путем применения нескольких функций даты Oracle:

  • trunc(sysdate, 'yyyy') дает нам первое января текущего года
  • add_months(x, 11) дает нам первое декабря
  • last_day(x) дает нам тридцать первое декабря
  • to_char(x, 'DDD') дает нам номер тридцать первого декабря, 365 в этом году и 366 в следующем.
  • Эта последняя цифра предоставляет верхнюю границу для генератора строк CONNECT BY LEVEL <= X
0 голосов
/ 16 декабря 2016

Это хорошо работает в MS SQL

SELECT TOP (DATEDIFF(day,  DATEADD(yy, DATEDIFF(yy,0,getdate()), 0), DATEADD(yy, DATEDIFF(yy,0,getdate()) + 1, -1))) n = ROW_NUMBER() OVER (ORDER BY [object_id]), 
dateadd(day, ROW_NUMBER() OVER (ORDER BY [object_id]) - 1, DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) AS AsOfDate FROM   sys.all_objects 
0 голосов
/ 16 декабря 2011

вы можете использовать таблицу с контурами, она должна выглядеть примерно так:

create or replace type year_date_typ as object (v_day date);
create or replace type year_date_tab as table of year_date_typ;

CREATE OR REPLACE FUNCTION get_dates(year IN VARCHAR2) RETURN year_date_tab PIPELINED IS
v_start_date date := to_date('0101' || year, 'ddmmyyyy');
res year_date_typ := year_date_typ(null);
v_days_in_year integer := 365;
BEGIN
if to_char(last_day(to_date('0102'||year, 'ddmmyyyy')), 'dd') = '29' then
v_days_in_year := 366;
end if;
FOR i in 0 .. v_days_in_year integer-1 LOOP
res.v_day := v_start_date + i;
pipe row(res);
END LOOP;

return;
END get_dates;

и вы можете использовать ее:

select * from table(get_dates('2011'));
...