首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle vs SQL Server 函數對照表:遷移開發必備速查手冊

     編輯:Oracle 資料庫相關知識

前言:異構資料庫遷移的「翻譯官」

Oracle 與 SQL Server (T-SQL) 在函數命名、參數順序、回傳型別上存在顯著差異。本文整理 4 大類 23 項高頻函數對照,涵蓋數學、字串、日期、轉換/條件,並標註參數差異與遷移陷阱,作為開發遷移、跨平台 SQL 撰寫的桌邊速查表。

一、數學函數

功能SQL Server (T-SQL)Oracle備註/遷移提示
絕對值ABS(-1)ABS(-1)語法相同
向上取整 (Ceiling)CEILING(-1.001) → 0CEIL(-1.001) → 0Oracle 縮寫 CEIL
向下取整 (Floor)FLOOR(-1.001) → -2FLOOR(-1.001) → -2語法相同
截取整數 (Truncate)CAST(-1.002 AS INT) → -1TRUNC(-1.002) → -1Oracle TRUNC 可指定小數位 TRUNC(1.234,2)=1.23
四捨五入ROUND(1.23456,4) → 1.2346ROUND(1.23456,4) → 1.2346語法相同,Oracle 第 2 參數可負數 (十位、百位)
e 的冪次EXP(1) → 2.71828...EXP(1) → 2.71828...相同
自然對數 (ln)LOG(2.71828...) → 1LN(2.71828...) → 1SQL Server LOG 為自然對數,Oracle 用 LN
以 10 為底對數LOG10(10) → 1LOG(10,10) → 1Oracle LOG(base, value) 參數順序反轉
平方SQUARE(4) → 16POWER(4,2) → 16Oracle 通用 POWER
平方根SQRT(4) → 2SQRT(4) → 2相同
任意冪次POWER(3,4) → 81POWER(3,4) → 81相同
隨機數RAND() → 0~1DBMS_RANDOM.VALUE(0,1)Oracle 需呼叫 PL/SQL 套件,可指定範圍
正負號SIGN(-8) → -1SIGN(-8) → -1相同
圓周率 πPI() → 3.14159...無內建Oracle 自定義 ACOS(-1) 或常數 3.14159265358979323846
三角函數 (sin/cos/tan)參數為弧度參數為弧度相同,角度轉弧度 RADIANS() (SQL Server) / *ACOS(-1)/180 (Oracle)
反三角函數ASIN/ACOS/ATAN/ATN2 → 弧度ASIN/ACOS/ATAN/ATAN2 → 弧度Oracle ATAN2(y,x) 參數順序 y,x
角度/弧度互轉DEGREES(rad), RADIANS(deg)無內建Oracle 自行計算:deg * ACOS(-1)/180

二、字串函數

功能SQL ServerOracle備註
字串連接'11' + '22' + '33' → '112233'CONCAT('11','22') || '33' 或 '11' || '22' || '33'Oracle || 為標準連接運算子,CONCAT 僅兩參數
子字串SUBSTRING(str, start, len)SUBSTR(str, start, len)參數順序相同,Oracle start 可負數 (從尾部倒數)
字串長度LEN(str) (不含尾部空格)LENGTH(str) / LENGTHB(str) (位元組)SQL Server DATALENGTH 為位元組長度
大小寫轉換UPPER/LOWERUPPER/LOWER相同
去除空格LTRIM/RTRIM/TRIMLTRIM/RTRIM/TRIMOracle TRIM 可指定字元 TRIM('x' FROM str)
字串替換REPLACE(str, old, new)REPLACE(str, old, new)相同
字元編碼ASCII('a') → 97ASCII('a') → 97相同
編碼轉字元CHAR(97) → 'a'CHR(97) → 'a'Oracle 用 CHR
字串查找位置CHARINDEX('sub', str)INSTR(str, 'sub')Oracle INSTR 支援第 N 次出現、反向搜尋
左/右取字串LEFT(str, n), RIGHT(str, n)SUBSTR(str, 1, n), SUBSTR(str, -n)Oracle 用 SUBSTR 通用

三、日期時間函數

功能SQL ServerOracle關鍵差異
當前日期時間GETDATE() / SYSDATETIME()SYSDATE / SYSTIMESTAMPOracle SYSDATE 精確至秒,SYSTIMESTAMP 含毫秒/時區
日期加減DATEADD(day, 10, dt)dt + 10 (數字代表天) / dt + INTERVAL '10' DAYOracle 數字直接加減天,INTERVAL 支援年/月/日/時/分/秒
日期差值DATEDIFF(day, dt1, dt2)dt2 - dt1 (結果為天數含小數)Oracle 相減直接得天數,需 TRUNC 取整
日期截取CAST(dt AS DATE)TRUNC(dt) / TRUNC(dt, 'MM')Oracle TRUNC 強大,可截至年/月/日/週/時/分
日期格式化FORMAT(dt, 'yyyy-MM-dd') (2012+)TO_CHAR(dt, 'YYYY-MM-DD')Oracle 格式模型豐富 (FM、FX、SP、TH 等)
字串轉日期CAST('2023-01-01' AS DATE) / CONVERTTO_DATE('2023-01-01', 'YYYY-MM-DD')Oracle 必須指定格式模型,NLS_DATE_FORMAT 影響隱性轉換
日期元件擷取YEAR(dt), MONTH(dt), DAY(dt)EXTRACT(YEAR FROM dt), TO_CHAR(dt, 'MM')Oracle 標準 EXTRACT 或 TO_CHAR
月份最後一天EOMONTH(dt) (2012+)LAST_DAY(dt)相同功能
下一個工作日無內建NEXT_DAY(dt, 'FRIDAY')Oracle 特有
兩日期間月數DATEDIFF(month, dt1, dt2)MONTHS_BETWEEN(dt1, dt2)Oracle 結果含小數

四、轉換、條件、NULL 處理

功能SQL ServerOracle備註
NULL 替換ISNULL(col, default_val)NVL(col, default_val)Oracle NVL2(col, not_null_val, null_val) 三參數版
多值首個非 NULLCOALESCE(a,b,c)COALESCE(a,b,c)ANSI 標準,相同
條件表達式 (CASE)CASE WHEN cond THEN v1 ELSE v2 ENDCASE WHEN cond THEN v1 ELSE v2 END相同,Oracle 另支援 DECODE(col, val1, res1, val2, res2, default)
最大值 (標量)MAX(val) OVER (...) 或子查詢GREATEST(a,b,c)Oracle GREATEST/LEAST 為標量函數,非彙總
最小值 (標量)子查詢LEAST(a,b,c)同上
型別轉換CAST(expr AS TYPE), CONVERT(TYPE, expr)CAST(expr AS TYPE), TO_CHAR/TO_NUMBER/TO_DATEOracle 專用格式化轉換函數更強

五、遷移常見陷阱與最佳實務

  1. 隱性型別轉換:SQL Server 寬鬆,Oracle 嚴格。遷移時務必顯式 CAST/TO_CHAR/TO_NUMBER/TO_DATE,避免 ORA-01722/ORA-018xx。
  2. SYSDATE **精度陷阱**:Oracle SYSDATE 無毫秒,高併發主鍵生成勿用 TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS'),改用 SYSTIMESTAMP + SEQ 或 SYS_GUID()。
  3. 日期格式模型:Oracle RR/RRRR (兩位年自動推斷世紀) vs YY/YYYY,遷移時統一用 YYYY 避免 2000 年問題。
  4. 字串連接 NULL 語義:Oracle 'A' || NULL = 'A',SQL Server 'A' + NULL = NULL (除非 SET CONCAT_NULL_YIELDS_NULL OFF)。遷移需用 NVL(col,'') 或 COALESCE 統一語義。
  5. 保留字衝突:Oracle 保留字較多 (如 LEVEL, UID, COMMENT),遷移時雙引號包裹或改名。

總結

函數對照是遷移第一步,真正挑戰在於語義等價:NULL 處理、日期精度、隱性轉換、排序規則、鎖行為。建議建立「函數映射標準庫」+「自動化改寫腳本」+「回歸測試資料集」,將人工修正降至最低。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved