日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle的iw算法,[转载]Oracle日期周详解IW

發布時間:2023/12/9 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle的iw算法,[转载]Oracle日期周详解IW 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1?ORACLE中周相關知識描述

1.1???????????日期格式化函數

TO_CHAR(X [,FORMAT]):將X按FORMAT格式轉換成字符串。X是一個日期,FORMAT是一個規定了X采用何種格式轉換的格式字符串,FORMAT與周相關的有W,WW,IW,D,FMWW。

W的含義是一個月的第幾周。是按照ORACLE自定義的標準周來返回周數。

IW是ISO標準周,它的含義是ISO標準周以周別為“主線”,每年最多可以有53個周別,但是每年至少要包含52個周別;如果一年當中第52周別之后至當年的12月31日之間,還有大于或等于4天的話,則定為當年的第53周,否則剩余這些天數被歸為下一年的第1周;如果在不足52周別的話,則以下一年的時間來補;每周固定的從周一開始作為本周的第1天,到周日作為本周的第7天;比如:在Oracle中2012年01月01號依然屬于IW周別2011年的第52周的第7天。這個用到的比較多。

WW是ORACLE自定義的標準周,它的含義是每年的1月1日作為當年的第一周的第一天(不管當年的1月1日是星期幾);比如:2014年01年01是周三,在Oracle中被定義為2014年WW的第一周的第一天。一般很少用到。

D是返回當前日期是這個星期的第幾天。是按照從周日到周六來進行計算的,這是要注意的地方。

FMWW該年1月1號(不考慮屬星期幾)開始至該年該一個星期日為第一周,第二周是從該年第一個星期開始算(這與IW算法相同)一年的最后一周以該年的12月31號做為截止。

1.2???????????日期時間運算函數

NEXT_DAY(X,Y):用于計算X時間后第一個星期Y的時間。Y是一個字符串,表示用當前會話語言表示的一周中某一天的全稱(如星期一、星期二等),也可以是數值。

TRUNC(X [,FORMAT]):截斷日期,FORMAT?中與周相關的有D,IW,WW,W,FMWW。

W的含義是一個月的第幾周。是按照ORACLE自定義的標準周來返回的是一個周數。

IW是ISO標準周,返回是的當前日期所在周的周一。

WW是ORACLE自定義的標準周。返回ORACLE自定義標準周所在的周一。

D的含義是的返回當前星期的第一天。令人感到奇怪的是根據D返回的是當前星期的第一天是星期日。這點是我們要注意的地方。

FMWW該年1月1號(不考慮屬星期幾)開始至該年該一個星期日為第一周,第二周是從該年第一個星期開始算(這與IW算法相同)一年的最后一周以該年的12月31號做為截止。取周的開始時間時在跨年的時候與IW有些區別,比如2012年01年01使用FMWW的時候,周的開始時間是2012-01-01,使用IW時,周的開始時間是2011/12/26。

ROUND(X [,FORMAT]):日期的四舍五入FORMAT中與周相關的有DAY。按周一到周三和周四到周日四舍五入到最近的周日。

2?根據給定時間取一周的開始時間和結束時間

--取周的開始時間和結束時間

SELECT TRUNC(TO_DATE('2014-07-18','YYYY-MM-DD'),'IW') AS STARTDATE FROM DUAL;--本周周一

SELECT TRUNC(TO_DATE('2014-07-18','YYYY-MM-DD'),'IW') + 6 AS ENDDATE FROM DUAL;--本周周日

SELECT TRUNC(TO_DATE('2014-07-18','YYYY-MM-DD'),'IW') - 7 AS STARTDATE FROM DUAL;---上周周一

SELECT TRUNC(TO_DATE('2014-07-18','YYYY-MM-DD'),'IW') - 1 AS ENDDATE FROM DUAL;--上周周日

3?根據給定周數取一周的開始時間和結束時間

取自然周的開始時間和結束時間的難點就需要判斷年初的那幾天是屬于本年的第一周,還是屬于上一年的最后一周,根據IW自然周的定義,少于等于3天是本年的話,屬于上一年的最后一周,大于等于4天屬于本年的話,加上上年的最后幾天,算成本年的第一周。

--按照周一到周日為一周算周的開始時間和結束時間(IW)自然周

WITH PARAMS AS (SELECT TRUNC(TO_DATE('2009-01-01','YYYY-MM-DD'),'YYYY') AS SD FROM DUAL)

SELECT LEVEL 周次,

DECODE(SIGN(5-DECODE(TO_CHAR(PM.SD,'D'),'1','7',TO_CHAR(PM.SD,'D'))),-1,

NEXT_DAY(PM.SD+(LEVEL-1)*7,2),NEXT_DAY(PM.SD+(LEVEL-1)*7-7,2))

當周第一天,

DECODE(SIGN(5-DECODE(TO_CHAR(PM.SD,'D'),'1','7',TO_CHAR(PM.SD,'D'))),-1,

NEXT_DAY(PM.SD+(LEVEL-1)*7,2),NEXT_DAY(PM.SD+(LEVEL-1)*7-7,2)) + 6

當周最后一天

FROM DUAL D

LEFT JOIN PARAMS PM ON 1=1

CONNECT BY LEVEL<=53

--按照周日到周六為一周算周的開始時間和結束時間(D)

SELECT LEVEL 周次,(TRUNC(TO_DATE('2011-01-01','YYYY-MM-DD'),'YYYY')-7) + (7-TO_CHAR(TRUNC(TO_DATE('2011-01-01','YYYY-MM-DD'),'YYYY'),'D')+1)+(LEVEL-1)*7 當周第一天,

(TRUNC(TO_DATE('2011-01-01','YYYY-MM-DD'),'YYYY')-7) + (7-TO_CHAR(TRUNC(TO_DATE('2011-01-01','YYYY-MM-DD'),'YYYY'),'D')+1)+(LEVEL-1)*7+6 當周最后一天

FROM DUAL CONNECT BY LEVEL<=53

--按照ORACLE標準(WW)

SELECT LEVEL 周次,TO_DATE('2013-01-01','YYYY-MM-DD')+(LEVEL-1)*7 當周第一天,

TO_DATE('2013-01-01','YYYY-MM-DD')+(LEVEL-1)*7+

DECODE((TO_CHAR(TO_DATE('2013-12-31','YYYY-MM-DD'),'DDD')-(LEVEL-1)*7),1,0,2,1,6) 當周最后一天

FROM DUAL CONNECT BY LEVEL<=53

4?獲取一年的最大周次

--獲取一年中的最大周次(IW)中國日歷自然周

WITH PARAMS AS (SELECT '2014' AS NF FROM DUAL)

SELECT TO_CHAR(TO_DATE(PM.NF || '-12-28','YYYY-MM-DD'),'IYYYIW') FROM DUAL LEFT JOIN PARAMS PM ON 1=1

上述SQL通過卡每年的12月28號屬于哪個周,也判斷一年有多少個自然周。

5??特別應該注意的地方

取周別的時候最好把年份帶上,第一因為周別是相對于哪年的第幾周,第二因為當使用IW的時候對于一年的開始那幾天和結束那幾天可能會產生一樣的周數,就分不清屬于哪年的第一周。

1、日期比較時精確到日,可以使用 TRUNC(sysdate,'dd')函數。

函數支持格式有:yyyy MM? dd? hh Mi

可以用 select TRUNC(sysdate,'yyyy') from dual? 看看結果是什么。

不要按下面的方式比較日期:

TO_DATE(TO_CHAR(LOGTIME,'YYYY-MM-DD'), 'YYYY-MM-DD') < TO_DATE(TO_CHAR(SYSDATE - $DAYNUM$,'YYYY-MM-DD'), 'YYYY-MM-DD')

2、trunc(d1[,c1])??返回日期d1所在期間(參數c1)的第一天日期

d1日期型,c1為字符型(參數),c1默認為j(即當前日期)

c1對應的參數表:

本周星期日:day或dy或d (每周順序:日,一,二,三,四,五,六)

本月初日期:month或mon或mm或rm

本季日期:q

本年初日期:syear或year或yyyy或yyy或yy或y(多個y表示精度)

本世紀初日期:cc或scc

【返回】:日期

select sysdate from dual --當時日期

select trunc(sysdate) from dual

select trunc(sysdate ,'DD') from dual --今天日期

select trunc(sysdate,'d')+7 from dual --本周星期日

select trunc(sysdate,'dy')+7 from dual? --本周星期日

select trunc(sysdate,'day')+7 from dual --本周星期日

select trunc(sysdate,'q') from dual--本季開始日期

select trunc(sysdate,'month') from dual --本月開始日期

select trunc(sysdate ,'mm') from dual --本月開始日期

select trunc(sysdate,'year') from dual? --本年開始日期

select trunc(sysdate ,'yyyy') from dual --本年開始日期

select trunc(sysdate ,'HH24') from dual --本小時開始時間

select trunc(sysdate ,'MI') from dual --本分鐘開始時間

select trunc(sysdate ,'CC') from dual --本世紀開始時間

select trunc(LAST_DAY(sysdate),'dd') from dual --本月最后一天

3、round(10.2356,2)函數可以對數字按指定保留小數位數四舍五入,這個函數還可以對日期四舍五入

select round(sysdate,'yyyy') from dual 四舍五入到年

select round(sysdate,'mm') from dual 四舍五入到月

select round(sysdate,'dd') from dual 四舍五入到日

select round(sysdate,'hh') from dual 四舍五入到小時

select round(sysdate,'mi') from dual 四舍五入到分鐘

4、TRUNC還可以對number類型使用,

TRUNC(89.985,2)=89.98

TRUNC(89.985)=89

TRUNC(89.985,-1)=80

總結

以上是生活随笔為你收集整理的oracle的iw算法,[转载]Oracle日期周详解IW的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。