oracle:如何用sql生成日历

BI分析中,经常需要将事实表与时间维度表关联起来,按年/月/日来逐层展示,常用的做法是创建一张日历表,结构类似如下:

create table T_BAS_CALENDAR
(
  d_year  NUMBER(4) not null,
  d_month NUMBER(2) not null,
  d_day   NUMBER(2) not null
);
comment on table T_BAS_CALENDAR
  is '日历表';
comment on column T_BAS_CALENDAR.d_year
  is '年';
comment on column T_BAS_CALENDAR.d_month
  is '月';
comment on column T_BAS_CALENDAR.d_day
  is '日';
alter table T_BAS_CALENDAR
  add constraint PK_BAS_CALENDAR primary key (D_YEAR, D_MONTH, D_DAY);

但是如何向这张表批量插入日历数据,方法就很多了,下面是仅用SQL语言生成日历的参考方法:

 1 create or replace procedure P_IMPORT_CALENDAR(p_year_start number,
 2                                               p_year_end   number) is
 3   cmonth    integer;
 4   cyear     integer;
 5   cday      integer;
 6   day_first integer;
 7   day_last  integer;
 8 begin
 9   --生成从p_year_start到p_year_end的所有日历 created by yjmyzz@126.com 2015-04-27
10
11   --firstly,delete history records
12   delete from T_BAS_CALENDAR where d_year between p_year_start and p_year_end;
13   for cyear in p_year_start .. p_year_end loop
14     for cmonth in 1 .. 12 loop
15       --get first-day of Month
16       select to_number(cyear || lpad(cmonth, 2, '0') || '01', '99999999')
17         into day_first
18         from dual;
19       --last-day of Month
20       select to_number(to_char(add_months(to_date(day_first, 'yyyyMMdd'), 1) - 1,
21                                'yyyyMMdd'),
22                        '99999999')
23         into day_last
24         from dual;
25       for cday in day_first .. day_last loop
26         --insert to table
27         INSERT INTO T_BAS_CALENDAR
28           (D_YEAR, D_MONTH, D_DAY)
29         VALUES
30           (CYEAR, CMONTH, SUBSTR(cday, 7));
31       end loop;
32     end loop;
33   end loop;
34   commit;
35 end P_IMPORT_CALENDAR;

 

时间: 2024-11-02 07:32:36

oracle:如何用sql生成日历的相关文章

Oracle用SQL打印日历

Oracle用SQL打印日历 1.1  打印当月日历 SELECT MAX(DECODE(DOW, 1, D, NULL)) SUN,        MAX(DECODE(DOW, 2, D, NULL)) MON,        MAX(DECODE(DOW, 3, D, NULL)) TUE,        MAX(DECODE(DOW, 4, D, NULL)) WED,        MAX(DECODE(DOW, 5, D, NULL)) THU,        MAX(DECODE(

教你如何用SQL Loader将Excel数据导出到Oracle

本文介绍如何用SQL Loader实现往oracle数据库中插入excel文件中的数据. 实现目的:往oracle数据库中,插入excel文件中的数据 实现步骤: 1.打开MicroSoft Excel 2000 2.文件(F)→新建(N)→工作簿→ 3.输入数据后,存盘为test.xls, 4.文件(F)→另存为(A)→ 保存类型为:制表符分隔,起名为text.txt,保存到C: \ 5.须先创建表结构: 连入SQL*Plus,以system/manager用户登录, SQL> conn sy

在Oracle 8i的SQL*Plus中如何利用LOB字段存取操作系统二进制文件

oracle|二进制    在Oracle 8i的SQL*Plus中如何利用LOB字段存取操作系统二进制文件                                                        广东省岭澳核电有限公司工程控制处管理信息科(518124)  黄福同           Oracle 8i数据库系统功能比前面版本更加完善,尤其是出现了BLOB,CLOB,NCLOB,BFILE这些LOB(大型对象)类型来取代功能有限的LONG.LONGRAW类型.BLOB字段

Ubuntu 14.04搭建PHP5+Apache2+Oracle及Oracle管理软件SQL Developer

Ubuntu 14.04搭建PHP5+Apache2+Oracle环境 最近开发的一个项目,数据库使用Oracle.Oracle本身支持Red Hat,对Ubuntu的支持并不好,如果Ubuntu需要安装Oracle,系统本身需要做伪装等很多工作,所以我只打算使用远程服务器上的Oracle数据库. 本地环境: Linux xxx-ThinkPad-T400 3.13.0-46-generic #75-Ubuntu SMP Tue Feb 10 15:24:04 UTC 2015 x86_64 x

如何用ejb生成表对象?

问题描述 如何用ejb生成表对象?例如:create-sql.sql写个程序生成这样的一个类createtabletablename(EbTablename.classidint,{nameVARCHAR(50),..............publicIntegerid;publicStringname;publicjava.lang.IntegergetId(){returnid;}publicvoidsetId(java.lang.Integerid){this.id=id;}......

sql-如何用SQL语句通过1去查询N?

问题描述 如何用SQL语句通过1去查询N? 解决方案 只需要通过1的ID查询N的记录就好了! 解决方案二: sql 语句的执行顺序(1)逻辑查询的各个阶段SQL中的n+1次select语句查询问题SQL中的n+1次select语句查询问题 解决方案三: 这个不就是普通的两张表自动关联而已嘛?通关关联两张表,把结果集放到java的容器里面,每条数据就代表的这种关系了啊,至于要展示成这样,就要看你报表怎么画了啊,ORACLE每条数据呈现的都是这两个表的一种对应关系,比如说1 研发部 1 刘备1 研发

sql-SQL 如何用SQL语句实现下列的想法

问题描述 SQL 如何用SQL语句实现下列的想法 假设存在一张手术信息表, id name operDate 1 张三 2015-07-21 11:30:21 2 李四 2015-07-21 13:45:21 3 张三 2015-07-22 09:18:35 4 王五 2015-07-23 13:54:46 5 张三 2015-07-25 12:00:00如何用SQL实现,判断有没有在24小时内再次做手术的呢?求指教 解决方案 1.分组后前后记录时间相减,然后看相减后是不是有小于24的.也就是用

Oracle SPM(SQL Plan Management)介绍及演示SQL

Oracle优化器辅助手段的发展 Oracle 8:hint Oracle 8i&9: stored outline Oracle 10: sql profile Oracle 11: sql plan manangement 优化器可能选择到很差的Plan. RBO->CBO 由规则序列生成执行计划,向着智能灵活化发展,根据数据对象的统计信息进行执行计划生成,根据cost选择最优. 但是CBO依赖统计信息,统计量又不能和数据表数据完全同步,当统计信息与实际数据差距大就会导致错误执行计划生成

如何用sql=select 语句来调用指定某个区间的文章

问题描述 如何用sql=select 语句来调用指定某个区间的文章 原来的编码是这样的,调用前8条新闻: sql="select top 8 * from Southidc_News where ViewFlag and SortID=2 order by NoticeFlag asc,id desc" 我想调用指定的第2条到第5条(指定区间的文章),该怎么改写啊? 解决方案 说白了,你无非就是需要一个服务器sql分页的代码. 不确定你用的是什么sql ,mysql oracle还是m