[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是一个规定了 ...
随机推荐
- Learning a Discriminative Feature Network for Semantic Segmentation(语义分割DFN,区别特征网络)
1.介绍 语义分割通常有两个问题:类内不一致性(同一物体分成两类)和类间不确定性(不同物体分成同一类).本文从宏观角度,认为语义分割不是标记像素而是标记一个整体,提出了两个结构解决这两个问题,平滑网络 ...
- DH密钥加解密
一.概述 1.与对称加密算法的主要差别在于,加密和解密的密钥不相同,一个公开(公钥),一个保密(私钥).主要解决了对称加密算法密钥分配管理的问题,提高了算法安全性. 2.非对称加密算法的加密.解密的效 ...
- 【JVM】虚拟机类加载机制
什么是类加载 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. <[JVM]类文件结构& ...
- Go -- client 302 自动转 200 问题 cookie存储 模拟登陆问题
不久前用go写了个http client,去模拟某网站(*.com)的登录操作.网站的登录逻辑:1.验证登录账号和密码:2.下发token.此token通过cookie下发:3.redirect到主页 ...
- comparison of truncate vs delete in mysql/sqlserver
comparison of truncate vs delete in mysql/sqlserver [duplicate] DELETE DELETE is a DML Command. DE ...
- 《Linux设备驱动程序》编译LDD3的scull驱动问题总结***
由于Linux内核版本更新的原因,LDD3(v2.6.10)提供的源码无法直接使用,下面是本人编译scull源码时出现的一些问题及解决方法.编译环境:Ubuntu 10.04 LTS(kernel v ...
- python gdal ogr osgeo
- IM 简介
LayIM - 打造属于你自己的网页聊天系统http://layim.layui.com/ 瓜子IM智能客服系统的数据架构设计(整理自现场演讲) - 知乎https://zhuanlan.zhihu. ...
- ansible常用的方法小结
一.批量安装zabbix客户端 .拷贝sh脚本和.conf到远程服务器(也可以全量拷贝客户端) ansible all -m copy -a "src=/usr/local/zabbix_a ...
- Python3基础 str : 字符串的逆序
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...