指令說明:
ORACLE
依功能可分成三類:
1.       基本函數
提供以月為增減整數單位的ADD_MONTHS函數。
2.   
時間間隔函數
遵循SQL99提供INTERVAL資料型態,即達成各種日期或混合單位的運算,時間間隔函數共有四個其中TO_YMINTERVAL及TO_DSINTERVAL函數可將年月/日時分秒字串轉換為時間間隔;NUMTOYMINTERVAL及NUMTODSINTERVAL則是指定數量(可為浮點數)之間格單位計算出算所得。
3.       INTERVAL資料型態
YEAR TO MONTH及DAY TO SECOND兩種型式的INTERVAL資料型態。
| 
語法 | 
說明 | 
| 
ADD_MONTHS(date, count) | 
將指定幾個月增減至日期時間 | 
| 
NUMTOYMINTERVAL(x, 'interval_unit') | 
指定數量(可為浮點數)間格單位 | 
| 
NUMTODSINTERVAL(x, 'interval_unit') | 
指定數量(可為浮點數)間格單位 | 
| 
TO_YMINTERVAL('[+|-]years-months) | 
時間間隔函數,將字串轉換為時間間隔 | 
| 
TO_DSINTERVAL('[+|-]days-seconds) | 
時間間隔函數,將字串轉換為時間間隔 | 
| 
INTERVAL 'time_expr' YEAR[(year_precision)] 
TO MONTH | 
SQL99所定義日期型態(YEAR TO MONTH) | 
| 
INTERVAL 'time_expr' DAY[(day_precision)]  
TO SECOND[(fractional_second_precision)] | 
SQL 99所定義日期型態(DAY
  TO SECOND) | 
範例: 
| 
 | 
MSSQL
MSSQL提供DATEADD()函數,可針對各種時間區間單位(如年、季、月、日、時、分及秒)以增加或減少整數單位數(如具小數自動捨位),進行時間區間單位增減運算。
| 
語法 | 
說明 | 
| 
DATEADD (Interval , count, date) | 
- 1st: 時間間隔單位(Interval): 年月日時分秒 
- 2nd: 增減時間間隔單位的次數(Count) 
- 3rd: 基準日期時間 | 
第一個引數為時間間隔單位(Interval),用以指定增、減運算的時間間隔單位,常用參數整理如下表。
第二個引數為增、減時間間隔單位的次數(Count),此值可為正數(未來),或負數(過去),但需特別注意,此值可接受浮點數,當指定的數值不是整數時,系統會自動捨棄值小數部分。
第三個引數為基準日期(Date),將基準日期加上Count次數的Interval後,即為傳回值之日期。
| 
Interval | 
縮寫 | 
| 
年 | 
yy、yyyy | 
| 
季 | 
qq、q | 
| 
月 | 
mm、m | 
| 
日 | 
dd、d | 
| 
週 | 
wk、ww | 
| 
時 | 
hh | 
| 
分 | 
mi、n | 
| 
秒 | 
ss、s | 
| 
毫秒 | 
ms | 
指令比較:
移除字串(str)前後空白(或特定字元)。比較如下:
| 
ORACLE | 
MSSQL | |
| 
語法 | 
ADD_MONTHS(date, count) | 
DATEADD(Interval , count, date) | 
| 
支援年/季/月加減 | 
ü(如月底日時則特殊處理) | 
ü | 
| 
日、時分秒加滅 | 
û | 
ü(支援) | 
| 
月數(count)捨位 | 
ü(小數位捨位) | 
ü(小數位捨位) | 
| 
年、月 
(資料型態) | 
INTERVAL 'time_expr' YEAR[(year_precision)] 
TO MONTH | 
û (不支援,僅部分支援) | 
| 
日、時、分、秒 
(資料型態) | 
INTERVAL
  'time_expr' DAY[(day_precision)] 
TO SECOND[(fractional_seconds_precision)] | 
û (不支援,僅部分支援) | 
範例:
| 
ORACLE | 
MSSQL | |
| 
延後12個月 | 
SELECT ADD_MONTHS(sysdate, 12) 
FROM DUAL  | 
SELECT DATEADD(mm, 12, getdate()) | 
| 
提前30分鐘 | 
SELECT sysdate - 30/60/24 
, sysdate - 30 * INTERVAL '1' MINUTE 
, sysdate + INTERVAL '-30' MINUTE 
FROM DUAL | 
SELECT getdate() - 30.0/60/24 
   , DATEADD(mi, -30, getdate())  
註: 使用運算方式時,需注意數值運算特性。 | 
| 
提前300天 | 
SELECT sysdate - 300 
  , sysdate + INTERVAL '-300' DAY(3) 
FROM DUAL | 
SELECT getdate() – 300 
   , DATEADD(dd, -300, getdate()) | 
由於ORACLE提供功能繁多,無法一一說明,建議可自行參閱官方文件。另外,ORACLE的月份增減運算時,請務必限制,當使用INTERVAL時,由於系統並不會先驗證日期合法性,如異常則將出現ORA-01839錯誤,建議月份增減運算時使用ADD_MONTHS函數,避免不必要困擾。
| 
SQL | 
說明 | 
| 
SELECT ADD_MONTHS(DATE'2020-01-31', 1)  
 --ORA-01839: date not
  valid for month specified 
 --,
  01/31增加一個月為02/31(日期不合法),以下三者均異常    
 --,
  DATE'2020-01-31' + NUMTOYMINTERVAL(1,
  'MONTH') 
 --,
  DATE'2020-01-31' + TO_YMINTERVAL('00-01')
   
 --,
  DATE'2020-01-31' + INTERVAL
  '1' MONTH       
FROM DUAL | 
月份增減運算,建議使用ADD_MONTHS函數 | 
建議延伸閱讀:
| 
函數 | 
資料庫 | 
延伸閱讀 | 
 
沒有留言:
張貼留言