DATENAME 是 SQL Server 專用的日期時間元件擷取函數,回傳 字串 (NVARCHAR) 形式的日期部分名稱或數值,配合語言環境自動顯示對應語言(如月份名稱、星期名稱)。本文整理所有 datepart 參數與實戰範例。
DATENAME ( datepart , date )
| datepart | 縮寫 | 說明 | 範例輸出 |
|---|---|---|---|
year | yy, yyyy | 四位數年份 | 2024 |
quarter | qq, q | 季度 (1-4) | 1 |
month | mm, m | 月份名稱 | 一月 / January |
dayofyear | dy, y | 年初至今天數 (1-366) | 45 |
day | dd, d | 月份中的日期 (1-31) | 15 |
week | wk, ww | 年份中的週數 (1-53) | 7 |
weekday | dw, w | 星期名稱 | 星期一 / Monday |
hour | hh | 小時 (0-23) | 14 |
minute | mi, n | 分鐘 (0-59) | 30 |
second | ss, s | 秒 (0-59) | 45 |
millisecond | ms | 毫秒 (0-999) | 123 |
microsecond | mcs | 微秒 (0-999999) | 123456 |
nanosecond | ns | 奈秒 (0-999999999) | 123456789 |
iso_week | isowk, isoww | ISO 8601 週數 (1-53) | 7 |
-- 當前日期時間
DECLARE @now DATETIME2(3) = SYSDATETIME();
-- 1. 日期格式 (配合 CONVERT/FORMAT 更靈活)
SELECT
CONVERT(VARCHAR(10), @now, 120) AS [YYYY-MM-DD], -- 2024-02-15
CONVERT(VARCHAR(10), @now, 112) AS [YYYYMMDD], -- 20240215
CONVERT(VARCHAR(8), @now, 108) AS [HH:MM:SS]; -- 14:30:45
-- 2. DATENAME 擷取各元件
SELECT
DATENAME(year, @now) AS [年份],
DATENAME(month, @now) AS [月份名稱],
DATENAME(day, @now) AS [日期],
DATENAME(quarter, @now) AS [季度],
DATENAME(dayofyear, @now) AS [年初天數],
DATENAME(week, @now) AS [週數],
DATENAME(weekday, @now) AS [星期名稱],
DATENAME(hour, @now) AS [小時],
DATENAME(minute, @now) AS [分鐘],
DATENAME(second, @now) AS [秒數],
DATENAME(millisecond, @now) AS [毫秒];
-- 3. 組合成自訂格式字串
SELECT
DATENAME(year, @now) + N'年' +
DATENAME(month, @now) + N'月' +
DATENAME(day, @now) + N'日 ' +
DATENAME(hour, @now) + N'時' +
DATENAME(minute, @now) + N'分' AS [中文完整格式];
| 函數 | 回傳型別 | 語言相依 | 適用場景 |
|---|---|---|---|
DATENAME | NVARCHAR | 是 (月份/星期名稱) | 報表顯示、需語言化名稱 |
DATEPART | INT | 否 | 計算、比較、分組、WHERE 條件 |
FORMAT | NVARCHAR | 是 (可指定 culture) | 複雜自訂格式、多語系報表 (SQL 2012+) |
-- 預設語言 (us_english)
SET LANGUAGE us_english;
SELECT DATENAME(month, '2024-02-15'); -- February
SELECT DATENAME(weekday, '2024-02-15'); -- Thursday
-- 切換繁體中文
SET LANGUAGE 繁體中文;
SELECT DATENAME(month, '2024-02-15'); -- 二月
SELECT DATENAME(weekday, '2024-02-15'); -- 星期四
GROUP BY DATENAME(month, OrderDate), DATENAME(year, OrderDate)WHERE DATENAME(weekday, CreatedAt) = N'星期一'DATENAME 為純量函數,大量資料列呼叫會影響效能。若在 WHERE/JOIN/GROUP BY 大量使用,建議:
DATEPART (INT) 比較/分組善用 DATENAME 的語言化特性,配合 DATEPART 計算優勢與 FORMAT 格式化彈性,能涵蓋絕大多數日期時間顯示與邏輯需求。