首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

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

     編輯:Oracle 資料庫基礎

前言:異構資料庫開發的函數對照痛點

SQL Server (T-SQL) 與 Oracle (PL/SQL) 函數命名、參數順序、回傳型別常不同。本文整理數學、字串、日期、轉換、比較等高頻函數對照,附帶範例,供遷移開發、雙平台維護快速查閱。

一、 數學函數

功能SQL ServerOracle備註
絕對值ABS(-1)ABS(-1)同名
天花板 (向上取整)CEILING(-1.001)CEIL(-1.001)Oracle 簡寫 CEIL
地板 (向下取整)FLOOR(-1.001)FLOOR(-1.001)同名
截斷 (向零取整)CAST(-1.002 AS INT)TRUNC(-1.002)Oracle TRUNC 可指定小數位
四捨五入ROUND(1.23456, 4)ROUND(1.23456, 4)同名,Oracle 可負數捨入到十位以上
e 的冪次EXP(1)EXP(1)同名
自然對數 (ln)LOG(2.718...)LN(2.718...)SQL Server LOG 為自然對數
以 10 為底對數LOG10(10)LOG(10, 10)Oracle LOG(base, val)
平方SQUARE(4)POWER(4, 2)Oracle 通用 POWER
平方根SQRT(4)SQRT(4)同名
任意次冪POWER(3, 4)POWER(3, 4)同名
隨機數RAND()DBMS_RANDOM.VALUE(0,1)Oracle 需套件
正負號SIGN(-8)SIGN(-8)同名
圓周率 πPI()無內建 (用 3.141592653589793 或 ACOS(-1))
三角函數 (弧度)SIN/COS/TANSIN/COS/TAN同名,參數皆弧度
反三角函數ASIN/ACOS/ATAN/ATN2ASIN/ACOS/ATAN/ATAN2同名
弧度↔角度DEGREES/RADIANS無內建 (自行 *180/PI 或 *PI/180)

二、 字串函數

功能SQL ServerOracle備註
集合最大值MAX(val) FROM (VALUES...)GREATEST(1, -2, 4, 3)Oracle 多參數直接比較
集合最小值MIN(val) FROM (VALUES...)LEAST(1, -2, 4, 3)
NULL 替換ISNULL(col, 'def')NVL(col, 'def')Oracle 12c+ 有 COALESCE (標準)
字元 ASCII 碼ASCII('a')ASCII('a')同名
ASCII 碼轉字元CHAR(97)CHR(97)
字串串接'11' + '22' + '33''11' || '22' || '33' 或 CONCAT('11','22')Oracle 用 || 或 CONCAT (僅 2 參數)
子串位置CHARINDEX('s', 'sdsq', 2)INSTR('sdsq', 's', 2)參數順序不同
模糊/模式位置PATINDEX('%d%q%', 'sdsfasdqe')REGEXP_INSTR(str, 'd.*q') (10g+)Oracle 用正則
子串擷取SUBSTRING('abcd', 2, 2)SUBSTR('abcd', 2, 2)同功能,名稱異
子串替換 (指定長度)STUFF('abcdef', 2, 3, 'ijklmn')REPLACE('abcdef', 'bcd', 'ijklmn')邏輯不同:STUFF 依位置/長度,REPLACE 依內容
全域替換REPLACE(str, old, new)REPLACE(str, old, new)同名同義
字元轉換 (逐字元)無直接對應TRANSLATE('fasdbfasegas', 'fa', '我')Oracle 強大 TRANSLATE
長度LEN / DATALENGTHLENGTH / LENGTHBLENGTHB 計算位元組
大小寫轉換LOWER / UPPERLOWER / UPPER同名
首字母大寫無內建INITCAP('abcd dsaf')Oracle 獨有
左補字元SPACE(10) + 'abcd'LPAD('abcd', 14) 或 LPAD('abcd', 14, '*')
右補字元'abcd' + SPACE(10)RPAD('abcd', 14)
去除空白LTRIM / RTRIMLTRIM / RTRIM / TRIMOracle TRIM 可指定字元
重複字串REPLICATE('abcd', 2)RPAD('abcd', 8, 'abcd') 或 PL/SQL 迴圈Oracle 無直接函數
發音相似 (Soundex)SOUNDEX('Smith')SOUNDEX('Smith')同名
Soundex 差異比較DIFFERENCE('Smithers','Smythers')UTL_MATCH.EDIT_DISTANCE_SIMILARITY (12c+)

三、 日期時間函數

功能SQL ServerOracle備註
目前日期時間GETDATE()SYSDATE (無秒) / SYSTIMESTAMP (含毫秒/時區)
日期加減天數GETDATE() + 10SYSDATE + 10同邏輯
格式化日期CONVERT(CHAR(10), GETDATE(), 120)TO_CHAR(SYSDATE, 'YYYY-MM-DD')Oracle 格式模型豐富
格式化時間CONVERT(CHAR(8), GETDATE(), 108)TO_CHAR(SYSDATE, 'HH24:MI:SS')
擷取日期部分DATEPART/DATENAME(interval, dt)TO_CHAR(dt, 'fmt') 或 EXTRACT(field FROM dt) (9i+)
月末日期EOMONTH(dt) (2012+)LAST_DAY(SYSDATE)
本週指定週日DATEADD(week, DATEDIFF(week, 0, dt), 0) 等NEXT_DAY(SYSDATE, 7) (7=週日)
字串轉日期CAST('2004-09-08' AS DATETIME)TO_DATE('2004-01-05 22:09:38', 'YYYY-MM-DD HH24:MI:SS')Oracle 必須指定格式
兩日期差值 (秒)DATEDIFF(SS, dt1, dt2)(dt1 - dt2) * 86400Oracle 相減得天數
日期加減間隔DATEADD(MI, 8, GETDATE())SYSDATE + 8/1440 (分/1440)
時區轉換SWITCHOFFSET / AT TIME ZONE (2016+)NEW_TIME(dt, 'YDT', 'GMT') (舊) / FROM_TZ/AT TIME ZONE (9i+)

Oracle TO_CHAR/TO_DATE 常用格式元素對照

元素意義SQL Server 對應
YYYY / YY4/2 位年份yyyy / yy
MM月份 (01-12)MM
DD日期 (01-31)DD
HH24 / HH1224/12 小時制HH / hh
MI分鐘 (00-59)MI
SS秒 (00-59)SS
FF / FF3小數秒 / 毫秒fff
DAY / DY星期名稱 / 縮寫DATENAME(WEEKDAY, dt)
D星期數 (1-7)DATEPART(WEEKDAY, dt)
Q季度DATEPART(QUARTER, dt)
WW / IW年週數 / ISO 週數DATEPART(WEEK, dt)

四、 遷移實戰提醒

  • 隱含轉換:Oracle 較嚴格,字串/日期運算請顯式 TO_DATE/TO_NUMBER。
  • SYSDATE 無時區、無毫秒 → 高精度/跨時區用 SYSTIMESTAMP + FROM_TZ。
  • DUAL 為 Oracle 虛擬表,單列單欄,SELECT ... FROM DUAL 為標準寫法;SQL Server 直接 SELECT ...。
  • NVL 只能兩參數,多重預設值用標準 COALESCE(a,b,c) (兩平台皆支援)。
  • 字串串接:Oracle 用 ||,SQL Server 用 + (若任意運算元為 NULL 結果為 NULL,需 ISNULL 處理)。
  • 分頁查詢:SQL Server OFFSET ... FETCH (2012+) / ROW_NUMBER() OVER;Oracle 12c+ OFFSET ... FETCH,舊版 ROWNUM 子查詢。

結語

函數對照是異構遷移的基礎工夫。建議團隊建立「函數映射規範文件」,配合自動化轉換工具 (如 SSMA、SQLines、自訂 Parser) 進行批次轉換,人工覆核高風險項目 (日期、NULL 處理、字串串接、型別轉換),即可大幅降低遷移錯誤率與工時。

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