異構資料庫遷移時,函數對照是關鍵工作之一。本文整理 DB2 與 Oracle 在型別轉換、日期時間、字串操作、數學運算四大類常用函數的對應關係,並提供實際 SQL 範例,加速遷移驗證。
| 功能 | Oracle | DB2 |
|---|---|---|
| 數值/日期轉字串 | TO_CHAR(expr, fmt) | CHAR(expr) 或 VARCHAR(expr) |
| 字串轉日期 | TO_DATE(str, fmt) | DATE(str)、TIMESTAMP(str) |
| 字串轉數值 | TO_NUMBER(str, fmt) | DECIMAL(str)、INTEGER(str) |
| 十六進位轉換 | RAWTOHEX | HEX(arg) |
範例:數值轉字串
-- Oracle
SELECT TO_CHAR(15.5000) FROM DUAL;
-- DB2
SELECT CHAR(15.5000) FROM SYSIBM.SYSDUMMY1;
範例:字串轉日期
-- Oracle
SELECT TO_DATE('2008-01-01', 'YYYY-MM-DD') FROM DUAL;
-- DB2
SELECT DATE('2008-01-01') FROM SYSIBM.SYSDUMMY1;
DB2 提供豐富的日期時間擷取函數,Oracle 則多用 EXTRACT 或 TO_CHAR 達到同樣目的。
| 功能 | DB2 函數 | Oracle 寫法 |
|---|---|---|
| 年份 | YEAR(date) | EXTRACT(YEAR FROM date) |
| 季度 | QUARTER(date) | TO_CHAR(date, 'Q') |
| 月份 | MONTH(date) | EXTRACT(MONTH FROM date) |
| 星期幾(數字) | DAYOFWEEK(date) | TO_CHAR(date, 'D') |
| 年度第幾天 | DAYOFYEAR(date) | TO_CHAR(date, 'DDD') |
| 日期轉整數(從 0001-01-01 起算) | DAYS(date) | date - DATE '0001-01-01' |
| 午夜至今秒數 | MIDNIGHT_SECONDS(time) | (date - TRUNC(date)) * 86400 |
| 月份名稱 | MONTHNAME(date) | TO_CHAR(date, 'MONTH') |
| 星期名稱 | DAYNAME(date) | TO_CHAR(date, 'DAY') |
常用日期運算對照
| 操作 | Oracle | DB2 |
|---|---|---|
| 目前日期時間 | SYSDATE | CURRENT DATE / CURRENT TIMESTAMP |
| 日期加 1 天 | SYSDATE + INTERVAL '1' DAY | CURRENT DATE + 1 DAY |
| 日期相減得天數 | DATE1 - DATE2 | DAYS(DATE1) - DAYS(DATE2) 或 DATE1 - DATE2 返回標籤 |
| 功能 | DB2 | Oracle |
|---|---|---|
| 長度 | LENGTH(str) | LENGTH(str) / LENGTHB(str) |
| 轉小寫 | LOWER(str) / LCASE(str) | LOWER(str) |
| 轉大寫 | UPPER(str) / UCASE(str) | UPPER(str) |
| 左修剪空白 | LTRIM(str) | LTRIM(str) / TRIM(LEADING FROM str) |
| 右修剪空白 | RTRIM(str) | RTRIM(str) / TRIM(TRAILING FROM str) |
| 兩側修剪空白 | LTRIM(RTRIM(str)) | TRIM(str) |
| 空值處理 | COALESCE(a, b) | NVL(a, b) / COALESCE(a, b) |
| 串接 | CONCAT(a, b) / a || b | CONCAT(a, b) / a || b |
| 插入/取代 | INSERT(src, pos, len, ins) | 無直接對應,需組合 SUBSTR |
| 查找位置 | LOCATE(find, in [, start]) / POSSTR(in, find) | INSTR(in, find [, start]) |
| 左擷取 | LEFT(str, len) | SUBSTR(str, 1, len) |
| 右擷取 | RIGHT(str, len) | SUBSTR(str, -len) |
| 重複 | REPEAT(str, n) | RPAD(str, LENGTH(str)*n, str) 技巧實現 |
| 替換 | REPLACE(src, old, new) | REPLACE(src, old, new) |
| 空白字串 | SPACE(n) | RPAD(' ', n) |
| 子字串 | SUBSTR(str, pos [, len]) | SUBSTR(str, pos [, len]) |
| 功能 | DB2 | Oracle |
|---|---|---|
| 絕對值 | ABS(n) | ABS(n) |
| 無條件進位 | CEIL(n) / CEILING(n) | CEIL(n) |
| 無條件捨去 | FLOOR(n) | FLOOR(n) |
| 餘數 | MOD(n1, n2) | MOD(n1, n2) |
| 隨機數 | RAND() (0~1) | DBMS_RANDOM.VALUE |
| 冪次方 | POWER(n1, n2) | POWER(n1, n2) |
| 四捨五入 | ROUND(n1 [, n2]) | ROUND(n1 [, n2]) |
| 符號 | SIGN(n) | SIGN(n) |
| 截斷 | TRUNCATE(n1 [, n2]) / TRUNC(n1 [, n2]) | TRUNC(n1 [, n2]) |
| 彙總函數 | COUNT, SUM, AVG, MAX, MIN | COUNT, SUM, AVG, MAX, MIN |
+ 1 DAY、- 2 MONTHS 等標準間隔語法,比 Oracle 的 INTERVAL 更直觀。LOCATE 與 POSSTR 參數順序相反,遷移時易出錯。NVL,統一用 COALESCE。