作者:討厭香菇_748 | 来源:互联网 | 2014-07-09 16:02
Oracle如何获取某年每月第N周星期X的所有日期要求:列出2012年每月第二周星期二的日期两种理解:www.2cto.com1.认为每周第一天为星期一(中国习惯),且需求为第二周周二(非第二个周二)[sql]--基本原理为用下周...SyntaxHighlighter.all(
要求:列出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)-小写