SQL Server 原生 CONVERT 僅支援固定格式代碼,無法像 C# DateTime.ToString("yyyy-MM-dd") 靈活自訂。本文提供自訂純量函數 fn_DateToString,支援 yyyy、MM、dd 佔位符替換。
CREATE FUNCTION dbo.fn_DateToString
(
@date DATETIME,
@format VARCHAR(20)
)
RETURNS VARCHAR(20)
AS
BEGIN
DECLARE @result VARCHAR(20);
-- 以 CONVERT 103 (dd/MM/yyyy) 為基底擷取日/月/年
SET @result = REPLACE(
REPLACE(
REPLACE(@format,
'yyyy', '20' + SUBSTRING(CONVERT(CHAR(8), @date, 3), 7, 2)),
'MM', SUBSTRING(CONVERT(CHAR(8), @date, 3), 4, 2)),
'dd', SUBSTRING(CONVERT(CHAR(8), @date, 3), 1, 2));
RETURN @result;
END
SELECT dbo.fn_DateToString(GETDATE(), 'yyyy-MM-dd'); -- 2024-05-18
SELECT dbo.fn_DateToString(GETDATE(), 'MM/dd/yyyy'); -- 05/18/2024
SELECT dbo.fn_DateToString(GETDATE(), 'yyyy年MM月dd日'); -- 2024年05月18日
HH、mm、ss、fff 時間佔位符 (擷取 CONVERT(CHAR(12), @date, 114) 或 DATEPART)。yyyy 四位數年份 (目前固定 20 前綴,需改用 YEAR(@date) 格式化)。FORMAT (SQL 2012+)。SELECT FORMAT(GETDATE(), 'yyyy-MM-dd', 'zh-TW'); -- 內建格式化、支援文化特性
FORMAT 依賴 .NET Framework,效能較純 T-SQL 函數低,高頻呼叫場景仍建議自訂函數或應用層格式化。
fn_DateToString 以純 T-SQL 實現類 C# 格式化字串體驗,適用 SQL 2005/2008/R2 等舊版環境。新版環境優先使用 FORMAT 或應用層格式化,兼顧效能與國際化。