茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1672161 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
PIMG_00094.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2019/1/24 14:52:05
Oracle Between用法-迄日要包含時分秒-加映改善效能

有個需求要產報表,每次抓一個月的資料,利用 Oracle 的 Between 函式可以解決,但是要特別注意,若未加時分秒,會導致日期欄位若有記錄時分秒,該筆資料正好位於迄日時,會漏掉喔!

資料來源範例如下:
序號    日期區間
------    --------------------------
1000    2010/1/30
2000    2010/1/30
3000    2010/1/30 上午 12:00:58
4000    2010/1/30 下午 09:11:57
5000    2010/1/31
6000    2010/1/31 上午 12:01:12
7000    2010/1/31 下午 04:58:25

若用以下的 Sql,迄日未加時分秒,則最後兩筆 (6000、7000) 會漏掉喔!
SELECT CT.SEQ, CT.EFF_DATE FROM CT
 WHERE CT.EFF_DATE BETWEEN TO_DATE('2010/01/30', 'YYYY/MM/DD')
 AND TO_DATE('2010/01/31', 'YYYY/MM/DD');

正確應該要在迄日加上時分秒如下:
SELECT CT.SEQ, CT.EFF_DATE FROM CT
 WHERE CT.EFF_DATE BETWEEN TO_DATE('2010/01/30', 'YYYY/MM/DD')
 AND TO_DATE('2010/01/31 23:59:59', 'YYYY/MM/DD HH24:MI:SS');

*****************************************************************************

同場加映:

上述的方式,會因為使用了 Between 和 To_Date 函式,造成用不到 Index Key,效能頗差,可利用 Function-base index 解決。

參考Oracle官方:Creating a Function-Based Index

所以上述 Sql 要做效能調整,可以建立以下 Index:
CREATE INDEX IDX_EFF_DATE ON CT
(TO_CHAR(EFF_DATE, 'YYYYMMDDHH24MISS'));

然後查詢的 Sql 改成:
SELECT CT.SEQ, CT.EFF_DATE FROM CT
 WHERE TO_CHAR(CT.EFF_DATE, 'YYYYMMDDHH24MISS')
 BETWEEN '20100130000000' AND '20100131235959';

就會用到 Index,筆數多時,效能差可大了~~

--------
沒什麼特別的~
不過是一些筆記而已

原文出處:Oracle Between用法-迄日要包含時分秒-加映改善效能 | 獅子內心的OS - 點部落
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|