如何创建一年中所有日期的View
。 view
应填写从JAN-01到Dec-31的日期。我怎样才能在Oracle中做到这一点?
如果当前年份为365天,则view
应包含365行日期。如果当前年份有366天,view
应该有366行日期。我希望view
有一个DATE
类型的列。
答案 0 :(得分:11)
这个简单的视图可以做到:
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')
为我们提供了当年的1月1日add_months(x, 11)
为我们提供了12月的第一个last_day(x)
给了我们十二月三十一日to_char(x, 'DDD')
给出了12月31日,今年365和366的数量。 CONNECT BY LEVEL <= X
答案 1 :(得分:0)
你可以使用流水线表,它应该是这样的:
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'));
答案 2 :(得分:0)
这适用于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