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

DB2 字串、型別轉換與日期函數實用指南(修正版)

     編輯:DB2 教學

前言

原文標題為「DB2 字串函數與用法演示(2)」,但內容混雜了 SQL Server 函數(如 QUOTENAME、REPLICATE、STUFF、DATEADD、DATEDIFF、GETDATE 等),這些在 DB2 中不存在。本文重新整理,保留真正屬於 DB2 的函數,補正錯誤,並補充 DB2 對應語法,提供正確的參考依據。

一、DB2 字串操作函數

1. REPLACE - 字串替換

語法: REPLACE(源字串, 搜尋字串, 替換字串)

說明: 將源字串中所有出現的搜尋字串替換為替換字串。

SELECT REPLACE('ROMANND', 'NND', 'CCB') FROM SYSIBM.SYSDUMMY1; -- 'ROMACCB'

2. SPACE - 產生空白字串

語法: SPACE(長度)

說明: 返回指定長度的空白字串。長度為負值返回 NULL。

SELECT SPACE(10) FROM SYSIBM.SYSDUMMY1;

3. SUBSTR / SUBSTRING - 擷取子字串

語法: SUBSTR(字串, 起始位置 [, 長度])

說明: 從位置 1 起算擷取。省略長度則擷取至結尾。SUBSTRING 為同義詞,支援標準 SQL FROM ... FOR ... 語法。

SELECT SUBSTR('CDNJFDJFJD', 5, 2) FROM SYSIBM.SYSDUMMY1; -- 'FD'

4. INSERT - 插入/取代字串

語法: INSERT(源字串, 起始位置, 長度, 插入字串)

說明: 刪除源字串從起始位置長度的字元,插入新字串。此為 DB2 原生函數,對應 SQL Server 的 STUFF。

5. LOCATE / POSSTR - 查找位置

語法: LOCATE(搜尋字串, 被搜尋字串 [, 起始位置])
POSSTR(被搜尋字串, 搜尋字串)

說明: 返回首次出現位置(從 1 起算),找不到返 0。注意兩者參數順序相反。

6. REPEAT - 重複字串

語法: REPEAT(字串, 次數)

說明: 返回字串重複 N 次的結果。對應 SQL Server REPLICATE。

7. LEFT / RIGHT - 左右擷取

語法: LEFT(字串, 長度)、RIGHT(字串, 長度)

8. LTRIM / RTRIM / TRIM - 修剪空白

語法: LTRIM(字串)、RTRIM(字串)、TRIM([BOTH|LEADING|TRAILING] [字元] FROM 字串)

說明: DB2 9.7+ 支援標準 TRIM,可指定修剪字元與方向。

9. UPPER / LOWER / UCASE / LCASE - 大小寫轉換

標準寫法為 UPPER/LOWER。

10. CONCAT / || - 串接

CONCAT(a, b) 僅限兩引數;a || b || c 更彈性。

二、資料型別轉換函數

1. CAST - 標準轉換

語法: CAST(運算式 AS 資料型別 [長度])

說明: ANSI SQL 標準,跨資料庫可攜性最佳。

SELECT CAST('123' AS INTEGER) FROM SYSIBM.SYSDUMMY1;

2. 專用轉換函數

DB2 提供一系列型別專用函數,效能優於 CAST:

  • CHAR(expr)、VARCHAR(expr):轉字串
  • DECIMAL(expr, p, s)、INTEGER(expr)、SMALLINT(expr)、BIGINT(expr)、DOUBLE(expr)、REAL(expr):轉數值
  • DATE(expr)、TIME(expr)、TIMESTAMP(expr):轉日期時間
  • BLOB(expr)、CLOB(expr)、DBCLOB(expr):轉大物件
  • GRAPHIC(expr)、VARGRAPHIC(expr):轉圖形字串

3. CONVERT - 不支援

注意: DB2 無 CONVERT 函數。原文列出的 CONVERT、style 參數、MONEY、BIT、IMAGE、TEXT 等皆為 SQL Server 語法。遷移時請改用 CAST 或專用函數。

三、日期時間函數

1. 日期時間元件擷取

功能DB2 函數備註
年份YEAR(date)
月份MONTH(date)
日期DAY(date) / DAYOFMONTH(date)
年度第幾天DAYOFYEAR(date)
星期幾(1-7,1=星期天)DAYOFWEEK(date)
星期名稱DAYNAME(date)
月份名稱MONTHNAME(date)
季度QUARTER(date)
小時/分鐘/秒HOUR(time)/MINUTE(time)/SECOND(time)
微秒MICROSECOND(ts)

2. 日期運算

  • 加減間隔: date + 1 DAY、date - 3 MONTHS、timestamp + 2 HOURS 等標準語法。
  • 日期差值: DAYS(date1) - DAYS(date2) 得天數差;TIMESTAMPDIFF(單位, ts1 - ts2) 得指定單位差值。

3. 目前日期時間

  • CURRENT DATE、CURRENT TIME、CURRENT TIMESTAMP(特殊暫存器,非函數)
  • 無 GETDATE()、SYSDATE 等函數。

4. 格式化輸出

DB2 無內建 DATENAME/DATEPART/TO_CHAR 風格格式化。常用做法:

  • 用 VARCHAR_FORMAT(ts, 'YYYY-MM-DD HH24:MI:SS')(DB2 9.7+)
  • 或組合 YEAR、MONTH、DAY 等函數自行拼裝
  • 應用層格式化

5. 不存在的 SQL Server 函數對照

SQL ServerDB2 對應寫法
DATEADD(unit, n, dt)dt + n UNIT(如 CURRENT DATE + 5 DAYS)
DATEDIFF(unit, dt1, dt2)TIMESTAMPDIFF(unit, dt2 - dt1) 或 DAYS(dt2) - DAYS(dt1)
DATENAME(unit, dt)DAYNAME(dt)/MONTHNAME(dt) 等個別函數
DATEPART(unit, dt)YEAR(dt)/MONTH(dt)/DAY(dt) 等個別函數
GETDATE()CURRENT TIMESTAMP
QUOTENAME(str, '[]')無內建,用 '[' || str || ']' 或應用層處理
REPLICATE(str, n)REPEAT(str, n)
REVERSE(str)無內建,需遞迴 CTE 或應用層實現
STUFF(str, start, len, ins)INSERT(str, start, len, ins)

總結

DB2 函數體系與 SQL Server/Oracle 差異極大。開發與遷移時,切勿假設函數名稱相同即語法相同。請以官方文件為準,善用 SYSIBM.SYSDUMMY1 驗證語法,並建立專案專屬的函數對照表,避免上線後發現函數不存在或行為不符預期。

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