iT邦幫忙

DAY 8
2

哇咧~夠了(Oracle SQL)系列 第 8

上旬!中旬、下旬,是否有規則可循?真是懷念台灣的紅蟳...趕緊去尋...

  • 分享至 

  • xImage
  •  

繼上次發文的討論題,下一個最接近的上旬、中旬、下旬的第一天?(ex, 9/1, 9/11, 9/21)?
乾脆發個文來說明。
為了驗證測試,以2月份的某一天來測試比較妥當,因為2月只有28天,其他大月31天的,則是直接去掉,如果程式不小心跑成2013/2/31,就會報錯啦~

開始測試文;

Select To_Number(To_Char(To_Date('20130225', 'yyyymmdd'), 'dd')) Dd From Dual;

=25

要換算出 2013/3/1,該怎麼算?
基本上,第一個處理動作就是,讓他每10天去做trunc,但是trunc可沒提供這功能吧!DIY吧!

首先,每月1-10 = 0, 11-20 = 1, 21-31 = 2;

Select Trunc(To_Number(To_Char(To_Date('20130225', 'yyyymmdd'), 'dd')-1)/10) Dd From Dual;

=2

接著讓這個結果變成10天後日期,以下用變數:Feb25替代'20130225';

Select (Trunc(To_Number(To_Char(To_Date(:Feb25, 'yyyymmdd'), 'dd')-1)/10)+1)*10 +1 Dd From Dual;

=31,但2月可沒有31日!還要再加工過。

大於31以後的都應該變成下個月1號,否則就歸零到月初+計算出的天數-1即可;

Select Decode(
((Trunc(To_Number(To_Char(To_Date(:Feb25, 'yyyymmdd'), 'dd')-1)/10)+1)*10 +1),
31, Trunc(Add_Months(To_Date(:Feb25, 'yyyymmdd'), 1), 'mm'),
Trunc(To_Date(:Feb25, 'yyyymmdd'), 'mm') + ((Trunc(To_Number(To_Char(To_Date(:Feb25, 'yyyymmdd'), 'dd')-1)/10)+1)*10 +1) - 1 ) Dd
From Dual;

=2013/3/1 OK了。測試多個日子,確認是OK的!

p.s 這種功能真的寫個pl/sql, 用package、function都好,別真的費心搞這種單一SQL,不然後人會研究老半天還未必看得懂。


上一篇
轉檔的小技巧(Oracle SQL)。(2013/09/22)
下一篇
「不憤不啟,不悱不發。舉一隅不以三隅反,則不復也」(Oracle SQL 2013/09/24)
系列文
哇咧~夠了(Oracle SQL)28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
老鷹(eagle)
iT邦高手 1 級 ‧ 2013-09-24 08:26:14

沙發

月半車甫 iT邦研究生 3 級 ‧ 2013-10-25 14:01:30 檢舉

忘了要感謝鷹大的回應謝謝

我要留言

立即登入留言