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,'yyyy'),rownum-1),7)
+decode(next_day(add_months(trunc(sysdate,'yyyy'),rownum-1),7),add_months(trunc(sysdate,'yyyy'),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,'w') = 2 表每月第二周
--to_char(c1,'d') = 3 表周二,值为1表周日
select c1
from
(
select to_date(2012||'-01-01','yyyy-mm-dd')+level c1
from dual
connect by level < 366
)
where to_char(c1,'w') = 2 and to_char(c1,'d') = 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)-小写