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

SQL Server 日期時間函數大全:GETDATE、DATENAME、DATEPART 與 CONVERT 實戰用法

     編輯:關於SqlServer

核心日期時間函數速查表

函數用途回傳型別範例
GETDATE()取得目前系統日期時間 (精確到毫秒)DATETIMESELECT GETDATE(); -- 2024-05-20 14:30:45.123
DATENAME(datepart, date)取得日期指定部分的字串名稱 (如月份名稱、星期名稱)NVARCHARSELECT DATENAME(month, GETDATE()); -- 五月
DATEPART(datepart, date)取得日期指定部分的整數值 (適合運算/比較)INTSELECT DATEPART(weekday, GETDATE()); -- 2 (週一)
DATEADD(datepart, number, date)日期加減運算同輸入日期型別SELECT DATEADD(day, -7, GETDATE()); -- 一週前
DATEDIFF(datepart, start, end)兩日期差值計算INTSELECT DATEDIFF(day, '2024-01-01', GETDATE());
CONVERT(data_type, expression, style)日期格式化輸出 (style 代碼控制格式)指定型別SELECT CONVERT(VARCHAR(10), GETDATE(), 111); -- 2024/05/20

DATENAME / DATEPART 參數完整對照表

日期部分縮寫說明
yearyy, yyyy年份 (如 2024)
quarterqq, q季度 (1-4)
monthmm, m月份 (1-12 或 名稱)
dayofyeardy, y年間第幾天 (1-366)
daydd, d月份第幾天 (1-31)
weekwk, ww年間第幾週 (1-53)
weekdaydw星期幾 (1=週日 ... 7=週六,受 SET DATEFIRST 影響)
hourhh小時 (0-23)
minutemi, n分鐘 (0-59)
secondss, s秒 (0-59)
millisecondms毫秒 (0-999)

實戰範例集

1. 自訂 now() 函數 (SQL Server 2005+ 支援 UDF 呼叫 GETDATE)

CREATE FUNCTION dbo.fn_Now()
RETURNS DATETIME
AS BEGIN
    RETURN GETDATE();
END;
GO

-- 使用
SELECT dbo.fn_Now() AS CurrentDateTime;
GO

-- 移除
DROP FUNCTION dbo.fn_Now;

2. 取得「今年」、「本月」、「本週一」起始日期

-- 年初
SELECT DATEADD(year, DATEDIFF(year, 0, GETDATE()), 0);

-- 月初
SELECT DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0);

-- 本週一 (假設週一為週首)
SELECT DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0);

3. 格式化輸出常用 Style 代碼

Style輸出格式範例
112YYYYMMDD20240520
111YYYY/MM/DD2024/05/20
120YYYY-MM-DD HH:MI:SS (24h)2024-05-20 14:30:45
108HH:MI:SS14:30:45
113DD MON YYYY HH:MI:SS:MMM (歐洲預設)20 May 2024 14:30:45:123

4. 計算年齡 / 年齡區間分組

-- 精確年齡
SELECT DATEDIFF(year, BirthDate, GETDATE()) - 
       CASE WHEN DATEADD(year, DATEDIFF(year, BirthDate, GETDATE()), BirthDate) > GETDATE() THEN 1 ELSE 0 END AS Age;

-- 年齡層分組 (十歲一組)
SELECT (DATEDIFF(year, BirthDate, GETDATE()) / 10) * 10 AS AgeGroup, COUNT(*) 
FROM Users GROUP BY (DATEDIFF(year, BirthDate, GETDATE()) / 10) * 10;

SQL Server vs MySQL 日期型別差異

型別SQL ServerMySQL
日期DATE (2008+)DATE
日期時間DATETIME / DATETIME2(7) / SMALLDATETIMEDATETIME / TIMESTAMP
時間TIME (2008+)TIME
時間戳TIMESTAMP (Rowversion, 二進位)TIMESTAMP (自動更新日期時間)

注意:SQL Server 的 TIMESTAMP 是 ROWVERSION 同義詞,不儲存日期時間,僅用於版本控制/樂觀鎖。MySQL 的 TIMESTAMP 則是時區感知的日期時間。

效能提示

  • 避免在 WHERE 條件對欄位使用函數 (如 WHERE DATENAME(month, CreateDate) = '五月'),會導致索引失效。改用範圍查詢:WHERE CreateDate >= '2024-05-01' AND CreateDate < '2024-06-01'。
  • GETDATE() 為非確定性函數,用於計算欄位/檢查條件約束時需謹慎。
  • 大量資料日期轉換時,CONVERT 配合 style 代碼比字串拼接快得多。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved