oracle解析儒略日,利用to_char获取当前日期准确的周数!

总的来说周数的算法有两种:

算法一:iw算法,每周为星期一到星期日算一周,且每年的第一个星期一为第一周,就拿2014年来说,2014-01-01是星期三,但还是算为今年的第一周,可以简单的用sql函数获取当前的周数:

PgSQL

SQL> SELECT to_char(SYSDATE, 'iw'),sysdate from dual;

TO SYSDATE

-- ---------

02 07-JAN-14

1

2

3

4

5

SQL>SELECTto_char(SYSDATE,'iw'),sysdatefromdual;

TOSYSDATE

-- ---------

0207-JAN-14

可以看到2014-01-07是第二周,但是有一个地方需要注意,按照这样的算法,一年中要么是52周,或者53周,如果一年当中的第52周之后至当年的12月31日之前,还有大于或等于4天的话,那这几天就定为当年的第53周,如果不足4天,就将剩余的这些天数归为下一年的第一周,就拿今年举例,2013年30日和31日落单,不足4天,所以2013年只有52周,这2天定位2014年的第一周。

此外还有一个地方需要注意,比如2014-01-01是周三,2014年的第一个周一是2014-01-06,结果是第一个周一已经算是第二周了,这样程序处理起来可能比较麻烦,后面我们将会说明怎么处理。

算法二:ww算法,每年的1月1日作为当年的第一周的第一天,不管当年的1月1日是星期几,用sql表达就是

PgSQL

SQL> SELECT to_char(SYSDATE, 'ww'),sysdate from dual;

TO SYSDATE

-- ---------

01 07-JAN-14

1

2

3

4

5

SQL>SELECTto_char(SYSDATE,'ww'),sysdatefromdual;

TOSYSDATE

-- ---------

0107-JAN-14

可以看到这两种算法得出来的结果不一致,这种算法可能第一周和最后一周不足7天。但是算法简单。

通过如上两种算法,就可以得到日期的周数。

PgSQL

SQL> SELECT to_char(to_date('20140107', 'YYYY-MM-DD'),'iw') from dual;

TO

--

02

1

2

3

4

5

SQL>SELECTto_char(to_date('20140107','YYYY-MM-DD'),'iw')fromdual;

TO

--

02

另外附上用于日期和时间的Format:

FORMAT 描述

HH 一天的小时数 (01-12)

HH12 一天的小时数 (01-12)

HH24 一天的小时数 (00-23)

MI 分钟 (00-59)

SS 秒 (00-59)

MS 毫秒 (000-999)

US 微秒 (000000-999999)

SSSS 午夜后的秒 (0-86399)

AM 或 A.M. 或 PM 或 P.M. 正午标识(大写)

am 或 a.m. 或 pm 或 p.m. 正午标识(小写)

Y,YYY 带逗号的年(4 和更多位)

YYYY 年(4和更多位)

YYY 年的后三位

YY 年的后两位

Y 年的最后一位

IYYY ISO 年(4位或更多位)

IYY ISO 年的最后 3 位

IY ISO 年的最后 2 位

I ISO 年的最后一位

BC 或 B.C. 或 AD 或 A.D. 纪元标识(大写)

bc 或 b.c. 或 ad 或 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;周日是1)

W 一个月里的周数(1-5)(第一周从该月第一天开始)

WW 一年里的周数(1-53)(第一周从该年的第一天开始)

IW ISO 一年里的周数(第一个星期四在第一周里)

CC 世纪(2 位)

J 儒略日(自公元前4712年1月1日来的天数)

Q 季度

RM 罗马数字的月份(I-XII;I=JAN)(大写)

rm 罗马数字的月份(I-XII;I=JAN)(小写)

TZ 时区名 (大写)

tz 时区名 (小写)

转载请注明: 版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

最后编辑:2014-01-08作者:Jerry

61f384f23c24a3306817dc87a6906c2d.png

一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值