Oracle使用SQL语句可以实现日历的功能,下面就为您详细介绍Oracle使用SQL语句生成日历的实现方法,希望对您能有所帮助。

1 要构造某年某月的日历,必须先知道这个月的开始时间,结束时间及天数

开始日期 例如 2006年11月

select to_date('20061101','yyyymmdd') as startDayOfMon from  dual;

结束日期

select last_day(to_date('20061101','yyyymmdd')) as endDayOfMon from  dual;

日期区间天数

select last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1 as DayOfMon

from dual;

2 接下来就是需要得到开始时间到结束时间每一天的结果集

select * from (

select to_date('20061101','yyyymmdd') + level - 1 as everyDay from dual

connect by level<=

(last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1));

3 再进一步则是将该月中的日期分解成第几周,星期几。

select everyDay,to_char(everyday,'yyyy') as 年,

to_char(everyday,'mm') as 月,

to_char(everyday,'dd') as 日,

to_char(everyday,'dy') as 星期几,

lpad(to_char(everyday,'w'),6) as 该月的第几周,

lpad(to_char(everyday,'ww'),6) as 该年的第几周

from(select to_date('20061101','yyyymmdd') + level - 1 as everyDay from dual

connect by level<=

(last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1));

4 这个结果集求出来后,接下拉就是使用DECODE函数进行行列转换了

select everyDay,to_char(everyday,'yyyy') as 年,

to_char(everyday,'mm') as 月,

to_char(everyday,'dd') as 日,

to_char(everyday,'dy') as 星期几,

lpad(to_char(everyday,'w'),6) as 该月的第几周,

lpad(to_char(everyday,'ww'),6) as 该年的第几周,

lpad(decode(to_char(everyday,'dy'),'星期日',to_char(everyday,'dd')),3) as 星期日,

lpad(decode(to_char(everyday,'dy'),'星期一',to_char(everyday,'dd')),3) as 星期一,

lpad(decode(to_char(everyday,'dy'),'星期二',to_char(everyday,'dd')),3) as 星期二,

lpad(decode(to_char(everyday,'dy'),'星期三',to_char(everyday,'dd')),3) as 星期三,

lpad(decode(to_char(everyday,'dy'),'星期四',to_char(everyday,'dd')),3) as 星期四,

lpad(decode(to_char(everyday,'dy'),'星期五',to_char(everyday,'dd')),3) as 星期五,

lpad(decode(to_char(everyday,'dy'),'星期六',to_char(everyday,'dd')),3) as 星期六

from(select to_date('20061101','yyyymmdd') + level - 1 as everyDay from dual

connect by level<=

(last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1));

5 再进一步就是统计汇总了,大家发现一个小问题没有?

就是该月的第几周这里是按本月开始是星期几为开始的日期,很有意思,

这样我们按该日是该年的第几周则是以今年开始日期是星期几为开始日期

select  to_char(everyday,'w') as week,

sum(decode(to_char(everyday,'dy'),'星期日',to_char(everyday,'dd'))) as 星期日,

sum(decode(to_char(everyday,'dy'),'星期一',to_char(everyday,'dd'))) as 星期一,

sum(decode(to_char(everyday,'dy'),'星期二',to_char(everyday,'dd'))) as 星期二,

sum(decode(to_char(everyday,'dy'),'星期三',to_char(everyday,'dd'))) as 星期三,

sum(decode(to_char(everyday,'dy'),'星期四',to_char(everyday,'dd'))) as 星期四,

sum(decode(to_char(everyday,'dy'),'星期五',to_char(everyday,'dd'))) as 星期五,

sum(decode(to_char(everyday,'dy'),'星期六',to_char(everyday,'dd'))) as 星期六

from(select to_date('20061101','yyyymmdd') + level - 1 as everyDay

from dual

connect by level<= (last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1)

)

group by to_char(everyday,'w');

6 以上日历基本成功,但还有一个问题,就是一周的开始时间问题

select  to_char(everyday,'ww') as week,

sum(decode(to_char(everyday,'dy'),'星期日',to_char(everyday,'dd'))) as 星期日,

sum(decode(to_char(everyday,'dy'),'星期一',to_char(everyday,'dd'))) as 星期一,

sum(decode(to_char(everyday,'dy'),'星期二',to_char(everyday,'dd'))) as 星期二,

sum(decode(to_char(everyday,'dy'),'星期三',to_char(everyday,'dd'))) as 星期三,

sum(decode(to_char(everyday,'dy'),'星期四',to_char(everyday,'dd'))) as 星期四,

sum(decode(to_char(everyday,'dy'),'星期五',to_char(everyday,'dd'))) as 星期五,

sum(decode(to_char(everyday,'dy'),'星期六',to_char(everyday,'dd'))) as 星期六

from(select to_date('20061101','yyyymmdd') + level - 1 as everyDay

from dual

connect by level<= (last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1)

)

group by to_char(everyday,'ww');

7  这样虽然可以解决,但还存在问题,大家可以考虑下!也可以考虑下年历怎么做!

select  ceil((to_char(everyday,'dd')+(to_char(to_date('20061101','yyyymmdd'),'d')-1))/7) as week,

sum(decode(to_char(everyday,'dy'),'星期日',to_char(everyday,'dd'))) as 星期日,

sum(decode(to_char(everyday,'dy'),'星期一',to_char(everyday,'dd'))) as 星期一,

sum(decode(to_char(everyday,'dy'),'星期二',to_char(everyday,'dd'))) as 星期二,

sum(decode(to_char(everyday,'dy'),'星期三',to_char(everyday,'dd'))) as 星期三,

sum(decode(to_char(everyday,'dy'),'星期四',to_char(everyday,'dd'))) as 星期四,

sum(decode(to_char(everyday,'dy'),'星期五',to_char(everyday,'dd'))) as 星期五,

sum(decode(to_char(everyday,'dy'),'星期六',to_char(everyday,'dd'))) as 星期六

from(select to_date('20061101','yyyymmdd') + level - 1 as everyDay

from dual

connect by level<= (last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1)

)

group by ceil((to_char(everyday,'dd')+(to_char(to_date('20061101','yyyymmdd'),'d')-1))/7);

以上是最终的结果。

【编辑推荐】

【责任编辑:段燃 TEL:(010)68476606】

点赞 0

oracle+生成+sql语句,Oracle使用SQL语句生成日历的实现方法相关推荐

  1. oracle 生成 sql语句,Oracle使用SQL语句生成日历的实现方法

    Oracle使用SQL语句可以实现日历的功能,下面就为您详细介绍Oracle使用SQL语句生成日历的实现方法,希望对您能有所帮助. 1 要构造某年某月的日历,必须先知道这个月的开始时间,结束时间及天数 ...

  2. SQL Server,Oracle,DB2索引建立语句的对比

    http://database.51cto.com/art/201108/284540.htm SQL Server,Oracle,DB2索引建立语句的对比 2011-08-17 20:48 henr ...

  3. sql跟踪 oracle,oracle SQL语句跟踪详解

    本文主要内容为oracle SQL语句跟踪详解,废话不多说,马上进入正题. 对于跟踪的sql语句,生成的trace 文件放在udump 下 SQL> showparameter sql NAME ...

  4. ORACLE EXPLAIN PLAN的总结 (优化SQL语句)

    ORACLE EXPLAIN PLAN的总结 文章分类:数据库 在ORACLE数据库中,需要对SQL语句进行优化的话需要知道其执行计划,从而针对性的进行调整.ORACLE的执行计划的获得有几种方法,下 ...

  5. 使用Oracle的DBMS_SQL包执行动态SQL语句

    引用自:http://blog.csdn.net/ggjjzhzz/archive/2005/10/17/507880.aspx 在某些场合下,存储过程或触发器里的SQL语句需要动态生成.Oracle ...

  6. oracle++spm,ORACLE 11G 使用SPM来调整SQL语句的执行计划

    跟大家说明一下: ITSM 数据库迁移升级到11G后,有几条SQL语句的执行计划不正确,而且这些语句都是使用绑定变量的. 最初的调整想法是获得这些的语句的绑定变量值,将获得的字面值直接替换SQL语句的 ...

  7. oracle网页怎么翻译成中文,sql语句翻译成中文小工具

    sql语句看不懂,今天看了朋友写的一个sql语句,没看懂什么意思,还 这个应该是SQL2005以上版本的语句,且该语句用于临时用途:with关键字从resume表生成一个CTE(用表表达式,仅作用于单 ...

  8. oracle审计查询sql语句,Oracle 数据库审计

    保证数据库的安全有两种方式,一种是通过权限的存取控制机制,即通过预先控制来防止安全事件的发生:另一种是数据库审计,即对数据库活动做跟踪记录,当发生安全事件时,通过对数据库活动记录进行审计来发现并修复安 ...

  9. oracle创建主键sql语句,Oracle创建主键自增表(sql语句实现)及触发器应用

    Oracle创建主键自增表(sql语句实现)及触发器应用 1.创建表 复制代码 代码如下: createtableTest_Increase( useridnumber(10)NOTNULLprima ...

最新文章

  1. Linux系统root密码重置教程
  2. D3ctf-D3MUG(u3d
  3. 设计法则 - 菲茨定律 (转)
  4. c语言春考题目,PAT 2017年春考乙级真题(1066. 图像过滤)(C语言)
  5. Eclipse maven构建springmvc项目
  6. Python | Path 让文件路径提取变得简单(含代码)
  7. 《微观经济学》第五章弹性及其应用
  8. 我该如何带好你—我的团队
  9. springboot 实现自动屏蔽敏感词过滤器
  10. ArcGIS georeference地理配准提高精度
  11. python中append函数什么意思_在python中append()函数的作用是什么
  12. 应用市场免费推广资源合集
  13. 第10章:知识产权与标准化
  14. iOS ”打仙人掌“游戏一---游戏玩法实现
  15. 以Crotex M3为例讲解stm32芯片内部原理
  16. 计算机管理无法打开权限不足,win10 打不开软件管理员权限不够
  17. PTA 单链表分段逆转 (12 分)
  18. js实现身份证号码有效性验证
  19. 程序员眼中的 Eclipse
  20. 【前端面试之Vue】

热门文章

  1. BZOJ3437:小P的牧场(斜率优化DP)
  2. 获取properties文件的内容的几种方式
  3. .NET解决[Serializable] Attribute引发的Json序列化k_BackingField
  4. 第八章- 测试并发应用(引言)
  5. sublime theme color
  6. .Net中俩种使用不定参数的方法
  7. VMware 修复 vCenter 服务器中的严重 RCE 漏洞
  8. 开源的 DNS 转发软件 Dnsmasq 被曝7个漏洞,可劫持数百万台设备
  9. FortiGuard 被曝使用硬编码密钥和 XOR 加密通信
  10. 机器数与码制——如何在计算机内部存储数字、进行数据运算