[Oracle] - 关于星期(IW和WW)的算法
1. 查看数据库字符集(如果字符集不同,可能显示乱码)
select DECODE(parameter,
'NLS_TERRITORY',
'TERRITORY',
'NLS_LANGUAGE',
'LANGUAGE',
'NLS_CHARACTERSET',
'CHARACTER SET') name,
value
from v$nls_parameters
WHERE parameter IN ('NLS_TERRITORY', 'NLS_LANGUAGE', 'NLS_CHARACTERSET')

2. 查看数据库中指定日期为周几
create or replace function Get_weekday(pDate date) return number is
vResult number;
begin
select case to_char(pDate, 'FmDay', 'nls_date_language=english')
when 'Monday' then
1
when 'Tuesday' then
2
when 'Wednesday' then
3
when 'Thursday' then
4
when 'Friday' then
5
when 'Saturday' then
6
when 'Sunday' then
7
end d
into vResult
from dual;
return vResult;
end;
不推荐(根据NLS设置不同结果不同,例如周一为第一天和周日为第一天的Weekday结果不同)
select sysdate Today,
to_char(sysdate, 'D') Weekday,
trunc(sysdate, 'DD') - to_char(sysdate, 'D') + 1 WeekFirstDay,
trunc(sysdate, 'DD') - to_char(sysdate, 'D') + 7 WeekLastDay
from dual;
3. Oracle 中关于星期(IW和WW)的算法
Oracle中对于星期的计算规则中,其中关于计算本周是一年的第几周,有两种格式,IW和WW,其中的区别官方文档解释如下:
- IW:基于 ISO标准计算出来的该年的第几周(1-52 or 1-53) 。
- WW:该年的第几周(1-53),其中第1周指该年的第1天至第7天。
从文档中可以看出,WW的算法是: int(dayOfYear+6)/7,个人觉得这种算法有点“2”。相信一般情况下,我们不会使用WW的吧,应该IW使用的比较多。
关于Oracle提到的这个星期的计算ISO标准,是这样的:
- 每个星期总是从周一开始,周日结束。
- 如果1月1日是周五、周六或周日,则这一周算为上一年的最后一周,因为这周的大部分时间属于上一年。
- 如果1月1日是周一、周二、周三或周四,则这一周算为新年的第一周,因为这周的大部分时间属于新的一年。
下面这两张表格,是从Oracle官方文档中截取出来的:
Table 3-7 First ISO Week of the Year: Example 1, January 1998
| Mo | Tu | We | Th | Fr | Sa | Su | ISO Week |
|---|---|---|---|---|---|---|---|
| - | - | - | 1 | 2 | 3 | 4 | First ISO week of 1998 |
| 5 | 6 | 7 | 8 | 9 | 10 | 11 | Second ISO week of 1998 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 | Third ISO week of 1998 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 | Fourth ISO week of 1998 |
| 26 | 27 | 28 | 29 | 30 | 31 | - | Fifth ISO week of 1998 |
Table 3-8 First ISO Week of the Year: Example 2, January 1999
| Mo | Tu | We | Th | Fr | Sa | Su | ISO Week |
|---|---|---|---|---|---|---|---|
| - | - | - | - | 1 | 2 | 3 | Fifty-third ISO week of 1998 |
| 4 | 5 | 6 | 7 | 8 | 9 | 10 | First ISO week of 1999 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 | Second ISO week of 1999 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 | Third ISO week of 1999 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 | Fourth ISO week of 1999 |
从表中可以看出,按照ISO标准算法,同样是1月1日,1998年是算第一周,而1999年的1月1日却算为上一年的最后一周。
这里需要注意的是,ISO标准中星期的第一天是周一,而Oracle中其他一些日期处理算法中(如D),默认每周的第一天是周日。因为第一天是周日还是周一,由参数NLS_TERRITORY决定,而该参数的默认值是从NLS_LANG继承过来的,NLS_LANG默认值为AMERICA,因此默认周日是每周的第一天)。
我们很多人认为中国人每周第一天从周一开始,其实不是这样哦,从Oracle上可以看出来,其实我国的每周第一天仍然是周日,与美国一致,只有德国、法国等一些欧洲国家是从周一开始的:
SQL> select to_char(sysdate,’yyyymmdd’) from dual; TO_CHAR(
——–
20110901 SQL> ALTER SESSION SET NLS_TERRITORY=AMERICA; Session altered. SQL> select to_char(sysdate,’d') from dual; T
-
5 SQL> ALTER SESSION SET NLS_TERRITORY=China; Session altered. SQL> select to_char(sysdate,’d') from dual; T
-
5 SQL> ALTER SESSION SET NLS_TERRITORY=GERMANY; Session altered. SQL> select to_char(sysdate,’d') from dual; T
-
4
参考资料
http://www.dw4e.com/?p=108
https://community.oracle.com/message/9511573#9511573
[Oracle] - 关于星期(IW和WW)的算法的更多相关文章
- 学习Oracle一个星期以来的总结
公司开发部门主要分2部分:.net开发和Oracle PL\SQL开发.刚入职的我被分到Oracle PL\SQL组了.Oracle是比SQL Server更大的数据库应用,我在学校只接触过SQL S ...
- oracle 获取星期日期
oracle 中的计算如下: 计算本星期的起始结束日期--得到星期一的日期select trunc(sysdate,''DD'')-to_char(sysdate,''D'')+2 from dual ...
- Oracle打印日历功能
Oracle用SQL打印日历 1.1 打印当月日历 , D, NULL)) SUN, , D, NULL)) MON, , D, NULL)) TUE, , D, NULL)) WED, , D, ...
- 关于Oracle to_char()函数中的IW,WW 周别显示
1)ww的算法为每年1月1日为第一周开始,date+6为每一周结尾 例如20050101为第一周的第一天,而第一周的最后一天为20050101+6=20050107 公式 每周第一天 :date + ...
- Oracle日期周详解IW
1 ORACLE中周相关知识描述 1.1 日期格式化函数 TO_CHAR(X [,FORMAT]):将X按FORMAT格式转换成字符串.X是一个日期,FORMAT是一个规定了X采用 ...
- [转载]Oracle日期周详解IW
1 ORACLE中周相关知识描述 1.1 日期格式化函数 TO_CHAR(X [,FORMAT]):将X按FORMAT格式转换成字符串.X是一个日期,FORMAT是一个规定了X采用 ...
- oracle得到日期对应的星期
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp56 select to_char(sysdate,'ww') fro ...
- 转:Oracle日期周详解以及周开始结束时间计算
目录(?)[-] ORACLE中周相关知识描述 日期格式化函数 日期时间运算函数 根据给定时间取一周的开始时间和结束时间 根据给定周数取一周的开始时间和结束时间 获取一年的最大周次 特别应该注意的地方 ...
- Oracle日期周具体解释以及周開始结束时间计算
1 ORACLE中周相关知识描写叙述 1.1 日期格式化函数 TO_CHAR(X [,FORMAT]):将X按FORMAT格式转换成字符串. X是一个日期,FORMAT是一个规定了 ...
随机推荐
- socket.error: [Errno 32] Broken pipe . tcp
经过检查发现,是由于客户端请求的链接,在一次循环之后,产生的套接字关闭,没有新的客户端套接字进行请求连接,所以产生broken pipe错误
- [CF 718C] Sasha and Array
传送门 Solution 用线段树维护矩阵 第一个操作相当于区间乘 第二个操作相当于区间求和 Code #include<bits/stdc++.h> #define ll long l ...
- 生成uuid 和 检验
//注意replaceAll前面的是正则表达式 String uuid = UUID.randomUUID().toString().replaceAll("-","&q ...
- 关于PHP中token的生成的解析
背景 很多时候我们需要用 token 来作为一些标识, 比如: 一个用户登录后的认证标识. 实现方式 md5 的方式: $v = 1; // 自己定义的 需要hash 的value 值 $key = ...
- 系统中sshd进程的查看,数量统计,进程号输出,进程清理命令
1. 查看sshd进程 ps -ef|grep sshd ps -ef:打开所有的进程 grep sshd:过滤出含有“sshd”字符的进程. 2. 查看sshd进程中的sftp进程,不含查询的进程 ...
- centos sqlite3安装及简单命令
安装:方法一:wget http://www.sqlite.org/sqlite-autoconf-3070500.tar.gztar xvzf sqlite-autoconf-3070500.tar ...
- nxp基于layerscape系列芯片的硬件型号解析
每一种layerscape系列芯片都有两种硬件型号: RDB 和QDS RDB: Refrence Design Board QDS: QorIQ Development system
- shell编程系列19--文本处理三剑客之awk中的字符串函数
shell编程系列19--文本处理三剑客之awk中的字符串函数 字符串函数对照表(上) 函数名 解释 函数返回值 length(str) 计算字符串长度 整数长度值 index(str1,str2) ...
- Linux记录-批量安装zabbix(转载)
同一文件夹下建立pwd.txt,格式如下: ip username password ip username password #!/bin/bash cat pwd.txt | while read ...
- k8s记录-etcd集群部署(三)
https://blog.csdn.net/fy_long/article/details/86542872 1)程序准备tar xvf etcd-v3.3.11-linux-amd64.tar.gz ...