Oracle--計算某一日期為一年中的第幾周


我自己實現的腳本:

select

T31267.CREATED_DATE as F31265,

(select to_char(to_date(T31267.CREATED_DATE,'yyyy-mm-dd'),'yyyyiw') from dual) as week

from  LEAP.HMDM_DM_DLR_CLUE T31267

 

總結:

select to_char(TO_DATE('20110101', 'YYYYMMDD'), 'yyyyiw') as week, --oracle求當年的第幾周  #常用,但是有一個問題,比如20181231是周一,但是卻計算結果為201801,即2018第一周內。
       to_char(TO_DATE('20110101', 'YYYYMMDD'), 'yyyyww') as week2, --oracle求當年的第幾周
       to_char(TO_DATE('20110101', 'YYYYMMDD'), 'yyyy') as year, --oracle求第幾年
       to_char(TO_DATE('20110101', 'YYYYMMDD'), 'yyyymm') as month, --oracle求當年的第幾月
       to_char(TO_DATE('20110101', 'YYYYMMDD'), 'yyyyddd') as day, --oracle求當年的第幾天
       to_char(TO_DATE('20110401', 'YYYYMMDD'), 'yyyyq') as quarter -- oracle求當年的第幾季度

  from dual

 

ww Same day of the week as the first day of the year  按年度1月1日的第一天為每周第一天
iw Same day of the week as the first day of the ISO week, which is Monday  每周一
w Same day of the week as the first day of the month  按月份1日的第一天作為每周第一天

這3個參數均為取每周第一天,區別如下:

ww,按每年的1月1日為第一周第一天,1月8日為第二周第一天……依此類推。

2010-1-1為2010年第一周第一天,取第一周的第一天,仍然為2010-1-1
SQL> select trunc(date'2010-1-1','w') from dual;    
 
TRUNC(DATE'2010-1-1','W')
-------------------------
2010-1-1

2010-1-6為2010年第一周第六天,取第一周的第一天,為2010-1-1
SQL> select trunc(date'2010-1-6','w') from dual;
 
TRUNC(DATE'2010-1-6','W')
-------------------------
2010-1-1

2010-1-9為2010年第二周第二天,取這一周的第一天,為2010-1-8
SQL> select trunc(date'2010-1-9','w') from dual;
 
TRUNC(DATE'2010-1-9','W')
-------------------------
2010-1-8

w與ww功能類似,不過它是按每月的1日為每周第一天,例如1日為當月第一周第一天,8日為第二周第一天……依此類推。
那也就是說,1月份的參數w與ww用trunc函數的結果應該是一致的。

2010-3-1為當月第一周第一天,因此結果為2010-3-1
SQL> select trunc(date'2010-3-1','w') from dual;
 
TRUNC(DATE'2010-3-1','W')
-------------------------
2010-3-1

 2010-3-8為當月第二周第一天,第二周第一天為2010-3-8
SQL> select trunc(date'2010-3-8','w') from dual;
 
TRUNC(DATE'2010-3-8','W')
-------------------------
2010-3-8
 
 2010-3-9為當月第二周第二天,2010-3-8為第二周第一天
SQL> select trunc(date'2010-3-9','w') from dual;
 
TRUNC(DATE'2010-3-9','W')
-------------------------
2010-3-8

iw,不受月份與年份的影響,直接取日期參數的周一。
SQL> select trunc(date'2010-3-9','iw') from dual;
 
TRUNC(DATE'2010-3-9','IW')
--------------------------
2010-3-8
 
 
參考:

TRUNC(number,num_digits) 
Number 需要截尾取整的數字。 
Num_digits 用於指定取整精度的數字。Num_digits 的默認值為 0。如果Num_digits為正數,則截取小數點后Num_digits位;如果為負數,則先保留整數部分,然后從個位開始向前數,並將遇到的數字都變為0。
TRUNC()函數在截取時不進行四舍五入,直接截取。

針對數字的案例,如:

select trunc(123.458) from dual --123

select trunc(123.458,0) from dual --123

select trunc(123.458,1) from dual --123.4

select trunc(123.458,-1) from dual --120

select trunc(123.458,-4) from dual --0

select trunc(123.458,4) from dual --123.458

select trunc(123) from dual --123

select trunc(123,1) from dual --123

select trunc(123,-1) from dual --120

 

針對日期的案例,如:

select trunc(sysdate) from dual --2017/6/13  返回當天的日期

select trunc(sysdate,'yyyy') from dual   --2017/1/1  返回當年第一天.

select trunc(sysdate,'mm') from dual  --2017/6/1  返回當月第一天.

select trunc(sysdate,'d') from dual  --2017/6/11 返回當前星期的第一天(以周日為第一天).

select trunc(sysdate,'dd') from dual  --2017/6/13  返回當前年月日

select trunc(sysdate,'hh') from dual  --2017/6/13 13:00:00  返回當前小時

select trunc(sysdate,'mi') from dual  --2017/6/13 13:06:00  返回當前分鍾

 

其他優秀鏈接推薦:

https://www.2cto.com/database/201302/191827.html
https://www.oschina.net/question/44870_3710


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM