【问题标题】:Create View with 365 days创建 365 天的视图
【发布时间】:2012-01-21 19:24:40
【问题描述】:

如何创建一个包含一年中所有日期的Viewview 应填写从 1 月 1 日到 12 月 31 日的日期。我如何在 Oracle 中做到这一点?

如果当年有 365 天,view 应该有 365 行日期。如果当年有 366 天,view 应该有 366 行日期。我希望view 有一个DATE 类型的列。

【问题讨论】:

  • 您想要一个 365 行的视图吗?还是特定年份的每一天的视图?由于闰年,有些年份有 366 天。您是否希望视图具有DATE 类型的单列,在这种情况下,我们需要知道您希望这些行来自哪个特定年份以及您是否希望更改它以便视图始终返回数据例如,今年。还是要返回一天的字符串表示形式?
  • 如果当年有 365 天,view 有 365 行日期。如果当年有 366 天,view 有 366 行日期。我希望视图具有DATE 类型的单列

标签: oracle plsql oracle11g date-arithmetic


【解决方案1】:

这个简单的视图就可以了:

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) 告诉我们 12 月 1 日
  • last_day(x) 告诉我们 12 月 31 日
  • to_char(x, 'DDD') 给了我们 12 月 31 日的号码,今年是 365,明年是 366。
  • 最后一个图提供了行生成器CONNECT BY LEVEL &lt;= X 的上限

【讨论】:

    【解决方案2】:

    你可以使用流水线表格,它应该是这样的:

    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'));
    

    【讨论】:

    • 收到此错误 PLS-00653:PL/SQL 范围内不允许聚合/表函数
    • 好吧,我的代码可能并不完美(我无法检查),但我仍然认为使用管道函数的方法更好,因为它可以让您将年份作为参数
    【解决方案3】:

    这在 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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 2016-01-04
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多