不同資料庫支援的函數各有差異,部分為通用標準,部分為特定資料庫專屬。本文整理 SQL Server、Oracle、DB2 三大主流資料庫在字串處理、日期運算、型別轉換三大類常用函數的語法差異,供開發人員跨平台開發時快速查閱參考。
LOWER、UPPER 三者通用,語法相同:
SELECT empno, ename, deptno
FROM emp
WHERE UPPER(ename) = UPPER('blake');
| 資料庫 | 語法範例 |
|---|---|
| SQL Server | SELECT 'Good' + 'String' |
| Oracle | SELECT CONCAT('Good', 'String') FROM dual; |
| DB2 | SELECT CONCAT('Good', 'String') FROM sysibm.sysdummy1; |
Oracle / DB2 寫法:
SELECT ename,
CONCAT(ename, job),
LENGTH(ename),
INSTR(ename, 'A')
FROM emp
WHERE SUBSTR(job, 1, 5) = 'SALES';
SQL Server 等價寫法:
SELECT ename,
(ename + job),
LEN(ename),
PATINDEX('%A%', ename)
FROM emp
WHERE SUBSTRING(job, 1, 5) = 'SALES';
| 功能 | Oracle/DB2 | SQL Server |
|---|---|---|
| 長度 | LENGTH | LEN |
| 尋找字元位置 | INSTR | PATINDEX / CHARINDEX |
| 子字串 | SUBSTR | SUBSTRING |
| 串接 | CONCAT / || | + |
| 資料庫 | 語法 |
|---|---|
| SQL Server | GETDATE() |
| Oracle | SYSDATE FROM dual |
| DB2 | CURRENT DATE FROM sysibm.sysdummy1 |
Oracle: 日期相減直接得天數
SELECT ename, (SYSDATE - hiredate) / 7 weeks
FROM emp WHERE deptno = 10;
SQL Server: 使用 DATEDIFF
SELECT ename, DATEDIFF(day, hiredate, GETDATE()) / 7 weeks
FROM emp WHERE deptno = 10;
DB2: SYSDATE 含時間戳不可直接運算,需用 DAYS 函數
SELECT ename, (DAYS(CURRENT DATE) - DAYS(DATE(hiredate))) / 7 weeks
FROM emp WHERE deptno = 10;
DATEPART(datepart, date):回傳指定日期部分(year, month, day, hour, minute 等)的整數值DATEDIFF(datepart, date1, date2):回傳兩日期指定單位的差值(整數)-- 範例
SELECT DATEPART(month, GETDATE()) AS 'Month Number';
SELECT DATEDIFF(month, '1991-6-12', '1992-6-21') AS a;
| 資料庫 | 語法範例 |
|---|---|
| SQL Server | CONVERT(char(10), hiredate) 或 CAST(hiredate AS char(10)) |
| Oracle | TO_CHAR(hiredate, 'fmDD Month YYYY') |
| DB2 | CHAR(CURRENT DATE), CHAR(CURRENT TIME) |
跨資料庫開發時,掌握核心函數的語法對照能大幅降低移植成本。建議將常用對照表整理為團隊共享文件,並在程式碼中封裝資料庫無關的工具類,進一步提升可維護性。