跨庫開發、遷移項目中,函數語法差異是高頻阻點。本文系統對照數學、三角、比較、字符串、日期、空值處理六大類 45 個常用函數,附參數差異與返回值示例,可直接打印作桌面速查卡。
| 功能 | SQL Server | Oracle | 備註 |
|---|---|---|---|
| 絕對值 | ABS(x) | ABS(x) | 同 |
| 向上取整 | CEILING(x) | CEIL(x) | |
| 向下取整 | FLOOR(x) | FLOOR(x) | 同 |
| 截取整數 | CAST(x AS INT) | TRUNC(x) | |
| 四捨五入 | ROUND(x, d) | ROUND(x, d) | Oracle 不保留尾部 0 |
| e^x | EXP(x) | EXP(x) | 同 |
| 自然對數 | LOG(x) | LN(x) | |
| 以10為底對數 | LOG10(x) | LOG(10, x) | |
| 平方 | SQUARE(x) | POWER(x,2) | |
| 平方根 | SQRT(x) | SQRT(x) | 同 |
| 冪運算 | POWER(x, y) | POWER(x, y) | 同 |
| 隨機數 | RAND() | DBMS_RANDOM.VALUE(0,1) | |
| 符號 | SIGN(x) | SIGN(x) | 同 |
| 功能 | SQL Server | Oracle | 備註 |
|---|---|---|---|
| 字符→ASCII | ASCII(c) | ASCII(c) | 同 |
| ASCII→字符 | CHAR(n) | CHR(n) | |
| 拼接 | 'a'+'b' 或 CONCAT | 'a'||'b' 或 CONCAT | Oracle 推薦 || |
| 子串位置 | CHARINDEX(sub, str, start) | INSTR(str, sub, start, occurrence) | 參數順序不同 |
| 模糊位置 | PATINDEX('%pat%', str) | 無直接對應,用 REGEXP_INSTR | |
| 取子串 | SUBSTRING(str, start, len) | SUBSTR(str, start, len) | 同 |
| 替換指定長度 | STUFF(str, start, len, new) | REPLACE(str, old, new) | 語義不同 |
| 全量替換 | REPLACE(str, old, new) | TRANSLATE(str, from, to) | TRANSLATE 逐字符映射 |
| 長度 | LEN / DATALENGTH | LENGTH / LENGTHB | |
| 大小寫 | UPPER / LOWER | UPPER / LOWER | 同 |
| 首字母大寫 | 無 | INITCAP(str) | |
| 左填充 | SPACE(n)+str | LPAD(str, n, ' ') | |
| 右填充 | str+SPACE(n) | RPAD(str, n, ' ') | |
| 去空格 | LTRIM / RTRIM | LTRIM / RTRIM / TRIM | Oracle 有 TRIM |
| 重複字符串 | REPLICATE(str, n) | 無 (可用 RPAD/LPAD 技巧) | |
| 諧音匹配 | SOUNDEX / DIFFERENCE | SOUNDEX | Oracle 無 DIFFERENCE |
| 功能 | SQL Server | Oracle | 備註 |
|---|---|---|---|
| 當前時間 | GETDATE() | SYSDATE | |
| 日期加減天 | DATEADD(day, n, dt) | dt + n | Oracle 直接數學運算 |
| 日期差(秒) | DATEDIFF(ss, dt1, dt2) | (dt2-dt1)*86400 | |
| 日期加減分 | DATEADD(mi, n, dt) | dt + n/1440 | |
| 格式化日期 | CONVERT(CHAR(10), dt, 20) | TO_CHAR(dt, 'YYYY-MM-DD') | |
| 格式化時間 | CONVERT(CHAR(8), dt, 108) | TO_CHAR(dt, 'HH24:MI:SS') | |
| 提取部分 | DATEPART/DATENAME | TO_CHAR(dt, 'fmt') | fmt 見下表 |
| 字符串轉日期 | CAST('...' AS DATETIME) | TO_DATE('...', 'fmt') | |
| 月末日期 | EOMONTH(dt) (2012+) | LAST_DAY(dt) | |
| 下一個周日 | 無直接函數 | NEXT_DAY(dt, 7) | |
| 時區轉換 | AT TIME ZONE (2016+) | NEW_TIME(dt, 'PST', 'GMT') | Oracle 參數見下表 |
| 含義 | SQL Server | Oracle |
|---|---|---|
| 年 | yy, yyyy | YY, YYYY |
| 季度 | qq, q | Q |
| 月 | mm, m | MM |
| 日 | dd, d | DD |
| 小時(12/24) | hh / hh24 | HH12 / HH24 |
| 分 | mi, n | MI |
| 秒 | ss, s | SS |
| 功能 | SQL Server | Oracle |
|---|---|---|
| 空值替換 | ISNULL(col, val) | NVL(col, val) / COALESCE |
| 最大值 | MAX() 聚合 | GREATEST(v1, v2, ...) |
| 最小值 | MIN() 聚合 | LEAST(v1, v2, ...) |
建議收藏:遷移項目遇到未列函數,優先查閱官方文檔 TRANSLATE_SQL 類工具或編寫 UDF 封裝差異。