Oracle使用SQL语句生成日历的实现方法

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

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

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

结束日期

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

日期区间天数

  1. select last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1 as DayOfMon  
  2.   from dual; 

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

  1. select * from (  
  2. select to_date('20061101','yyyymmdd') + level - 1 as everyDay from dual  
  3.   connect by level <=   
  4.   (last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1)); 

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

  1. select everyDay,to_char(everyday,'yyyy') as 年,  
  2.    to_char(everyday,'mm') as 月,  
  3.    to_char(everyday,'dd') as 日,  
  4.    to_char(everyday,'dy') as 星期几,  
  5.    lpad(to_char(everyday,'w'),6) as 该月的第几周,  
  6.    lpad(to_char(everyday,'ww'),6) as 该年的第几周  
  7.    from(select to_date('20061101','yyyymmdd') + level - 1 as everyDay from dual  
  8.   connect by level <=   
  9.   (last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1)); 

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

  1. select everyDay,to_char(everyday,'yyyy') as 年,  
  2.    to_char(everyday,'mm') as 月,  
  3.    to_char(everyday,'dd') as 日,  
  4.    to_char(everyday,'dy') as 星期几,  
  5.    lpad(to_char(everyday,'w'),6) as 该月的第几周,  
  6.    lpad(to_char(everyday,'ww'),6) as 该年的第几周,  
  7.    lpad(decode(to_char(everyday,'dy'),'星期日',to_char(everyday,'dd')),3) as 星期日,  
  8.    lpad(decode(to_char(everyday,'dy'),'星期一',to_char(everyday,'dd')),3) as 星期一,  
  9.    lpad(decode(to_char(everyday,'dy'),'星期二',to_char(everyday,'dd')),3) as 星期二,  
  10.    lpad(decode(to_char(everyday,'dy'),'星期三',to_char(everyday,'dd')),3) as 星期三,  
  11.    lpad(decode(to_char(everyday,'dy'),'星期四',to_char(everyday,'dd')),3) as 星期四,  
  12.    lpad(decode(to_char(everyday,'dy'),'星期五',to_char(everyday,'dd')),3) as 星期五,  
  13.    lpad(decode(to_char(everyday,'dy'),'星期六',to_char(everyday,'dd')),3) as 星期六  
  14.     from(select to_date('20061101','yyyymmdd') + level - 1 as everyDay from dual  
  15.   connect by level <=  
  1. (last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1)); 

5 再进一步就是统计汇总了,大家发现一个小问题没有?
  就是该月的第几周这里是按本月开始是星期几为开始的日期,很有意思,
  这样我们按该日是该年的第几周则是以今年开始日期是星期几为开始日期

  1. select  to_char(everyday,'w') as week,  
  2.         sum(decode(to_char(everyday,'dy'),'星期日',to_char(everyday,'dd'))) as 星期日,  
  3.         sum(decode(to_char(everyday,'dy'),'星期一',to_char(everyday,'dd'))) as 星期一,  
  4.         sum(decode(to_char(everyday,'dy'),'星期二',to_char(everyday,'dd'))) as 星期二,  
  5.         sum(decode(to_char(everyday,'dy'),'星期三',to_char(everyday,'dd'))) as 星期三,  
  6.         sum(decode(to_char(everyday,'dy'),'星期四',to_char(everyday,'dd'))) as 星期四,  
  7.         sum(decode(to_char(everyday,'dy'),'星期五',to_char(everyday,'dd'))) as 星期五,  
  8.         sum(decode(to_char(everyday,'dy'),'星期六',to_char(everyday,'dd'))) as 星期六  
  9.     from(select to_date('20061101','yyyymmdd') + level - 1 as everyDay   
  10.           from dual  
  11.           connect by level <= (last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1)  
  12.         )  
  13.   group by to_char(everyday,'w'); 

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

  1. select  to_char(everyday,'ww') as week,  
  2.         sum(decode(to_char(everyday,'dy'),'星期日',to_char(everyday,'dd'))) as 星期日,  
  3.         sum(decode(to_char(everyday,'dy'),'星期一',to_char(everyday,'dd'))) as 星期一,  
  4.         sum(decode(to_char(everyday,'dy'),'星期二',to_char(everyday,'dd'))) as 星期二,  
  5.         sum(decode(to_char(everyday,'dy'),'星期三',to_char(everyday,'dd'))) as 星期三,  
  6.         sum(decode(to_char(everyday,'dy'),'星期四',to_char(everyday,'dd'))) as 星期四,  
  7.         sum(decode(to_char(everyday,'dy'),'星期五',to_char(everyday,'dd'))) as 星期五,  
  8.         sum(decode(to_char(everyday,'dy'),'星期六',to_char(everyday,'dd'))) as 星期六  
  9.     from(select to_date('20061101','yyyymmdd') + level - 1 as everyDay   
  10.           from dual  
  11.           connect by level <= (last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1)  
  12.         )  
  13.   group by to_char(everyday,'ww'); 

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

  1. select  ceil((to_char(everyday,'dd')+(to_char(to_date('20061101','yyyymmdd'),'d')-1))/7) as week,  
  2.         sum(decode(to_char(everyday,'dy'),'星期日',to_char(everyday,'dd'))) as 星期日,  
  3.         sum(decode(to_char(everyday,'dy'),'星期一',to_char(everyday,'dd'))) as 星期一,  
  4.         sum(decode(to_char(everyday,'dy'),'星期二',to_char(everyday,'dd'))) as 星期二,  
  5.         sum(decode(to_char(everyday,'dy'),'星期三',to_char(everyday,'dd'))) as 星期三,  
  6.         sum(decode(to_char(everyday,'dy'),'星期四',to_char(everyday,'dd'))) as 星期四,  
  7.         sum(decode(to_char(everyday,'dy'),'星期五',to_char(everyday,'dd'))) as 星期五,  
  8.         sum(decode(to_char(everyday,'dy'),'星期六',to_char(everyday,'dd'))) as 星期六  
  9.     from(select to_date('20061101','yyyymmdd') + level - 1 as everyDay   
  10.           from dual  
  11.           connect by level <= (last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1)  
  12.         )  
  13.   group by ceil((to_char(everyday,'dd')+(to_char(to_date('20061101','yyyymmdd'),'d')-1))/7); 

以上是最终的结果。

 

 

 

【编辑推荐】

教您如何实现Oracle模糊查询

Oracle分页查询语句的写法

Oracle sqlplus语句编辑命令

Oracle循环语句的写法

Oracle修改用户语法介绍

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/242227.html<

(0)
管理的头像管理
上一篇2025-04-24 17:07
下一篇 2025-04-24 17:08

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注