热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle如何获取某年每月第N周星期X的所有日期

Oracle如何获取某年每月第N周星期X的所有日期要求:列出2012年每月第二周星期二的日期两种理解:www.2cto.com1.认为每周第一天为星期一(中国习惯),且需求为第二周周二(非第二个周二)[sql]--基本原理为用下周...SyntaxHighlighter.all(

Oracle如何获取某年每月第N周星期X的所有日期
 
要求:列出2012年每月第二周星期二的日期
 
两种理解:
  www.2cto.com  
1.认为每周第一天为星期一(中国习惯),且需求为第二周周二(非第二个周二)
 
[sql] 
--基本原理为用下周日之日期,利用decode判断是上推5日还是下推2日  
[sql] 
select next_day(add_months(trunc(sysdate,'yyyy'),rownum-1),1)  
    +decode(next_day(add_months(trunc(sysdate,'yyyy'),rownum-1),1),add_months(trunc(sysdate,'yyyy'),rownum-1)+7,-5,2)  
    from dual connect by rownum<13;  
  
output:  
2012.01.03 00:00:00  
2012.02.07 00:00:00  
2012.03.06 00:00:00  
2012.04.03 00:00:00  
2012.05.08 00:00:00  
2012.06.05 00:00:00  
2012.07.03 00:00:00  
2012.08.07 00:00:00  
2012.09.04 00:00:00  
2012.10.09 00:00:00  
2012.11.06 00:00:00  
2012.12.04 00:00:00  
2013.01.08 00:00:00  
  www.2cto.com  
2.认为每周第一天为星期日(外国习惯),且需求为第二周周二(非第二个周二)
 
[sql] 
--基本原理为用下周六之日期,利用decode判断是上推4日还是下推3日  
select next_day(add_months(trunc(sysdate,&#39;yyyy&#39;),rownum-1),7)  
    +decode(next_day(add_months(trunc(sysdate,&#39;yyyy&#39;),rownum-1),7),add_months(trunc(sysdate,&#39;yyyy&#39;),rownum-1)+7,-4,3)  
    from dual connect by rownum<13;  
  
output:  
2012.01.10 00:00:00  
2012.02.07 00:00:00  
2012.03.06 00:00:00  
2012.04.10 00:00:00  
2012.05.08 00:00:00  
2012.06.05 00:00:00  
2012.07.10 00:00:00  
2012.08.07 00:00:00  
2012.09.04 00:00:00  
2012.10.09 00:00:00  
2012.11.06 00:00:00  
2012.12.04 00:00:00  
2013.01.08 00:00:00  
  www.2cto.com  
3.认为每周第一天为星期日(外国习惯),且需求为每月第二个星期二
[sql] 
--基本原理为先构造全年之日期,再利用to_char函数  
--to_char(c1,&#39;w&#39;) = 2 表每月第二周  
--to_char(c1,&#39;d&#39;) = 3 表周二,值为1表周日  
select c1  
from   
(  
select to_date(2012||&#39;-01-01&#39;,&#39;yyyy-mm-dd&#39;)+level c1  
from dual  
connect by level <366  
)  
where to_char(c1,&#39;w&#39;) = 2 and  to_char(c1,&#39;d&#39;) = 3;  
  
output:  
2012.01.10 00:00:00  
2012.02.14 00:00:00  
2012.03.13 00:00:00  
2012.04.10 00:00:00  
2012.05.08 00:00:00  
2012.06.12 00:00:00  
2012.07.10 00:00:00  
2012.08.14 00:00:00  
2012.09.11 00:00:00  
2012.10.09 00:00:00  
2012.11.13 00:00:00  
2012.12.11 00:00:00  
 
总结:
不同理解可以得出不同结果,最好能请客户提供结果,以利判断。
 
附:
用于 date/time 转换的模板
 
模板 描述
HH 一天的小时数 (01-12)
HH12 一天的小时数 (01-12)
HH24 一天的小时数 (00-23)
MI 分钟 (00-59)
SS 秒 (00-59)
SSSS 午夜后的秒 (0-86399)
AM or A.M. or PM or P.M. 正午标识(大写)
am or a.m. or pm or p.m. 正午标识(小写)
Y,YYY 带逗号的年(4 和更多位)
YYYY 年(4和更多位)  www.2cto.com  
YYY 年的后三位
YY 年的后两位
Y 年的最后一位
BC or B.C. or AD or A.D. 年标识(大写)
bc or b.c. or ad or a.d. 年标识(小写)
MONTH 全长大写月份名(9字符)
Month 全长混合大小写月份名(9字符)
month 全长小写月份名(9字符)
MON 大写缩写月份名(3字符)
Mon 缩写混合大小写月份名(3字符)
mon 小写缩写月份名(3字符)
MM 月份 (01-12)
DAY 全长大写日期名(9字符)
Day 全长混合大小写日期名(9字符)
day 全长小写日期名(9字符)
DY 缩写大写日期名(3字符)
Dy 缩写混合大小写日期名(3字符)
dy 缩写小写日期名(3字符)
DDD 一年里的日子(001-366)
DD 一个月里的日子(01-31)
D 一周里的日子(1-7;SUN=1)
W 一个月里的周数
WW 一年里的周数
CC 世纪(2 位)
J Julian 日期(自公元前4712年1月1日来的日期)
Q 季度
RM 罗马数字的月份(I-XII;I=JAN)-大写
rm 罗马数字的月份(I-XII;I=JAN)-小写

推荐阅读
author-avatar
討厭香菇_748
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有