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

SQL Server DATENAME 函數完整應用指南:日期時間元件擷取與格式化

     編輯:關於SqlServer

DATENAME 是 SQL Server 專用的日期時間元件擷取函數,回傳 字串 (NVARCHAR) 形式的日期部分名稱或數值,配合語言環境自動顯示對應語言(如月份名稱、星期名稱)。本文整理所有 datepart 參數與實戰範例。

語法與參數

DATENAME ( datepart , date )
datepart縮寫說明範例輸出
yearyy, yyyy四位數年份2024
quarterqq, q季度 (1-4)1
monthmm, m月份名稱一月 / January
dayofyeardy, y年初至今天數 (1-366)45
daydd, d月份中的日期 (1-31)15
weekwk, ww年份中的週數 (1-53)7
weekdaydw, w星期名稱星期一 / Monday
hourhh小時 (0-23)14
minutemi, n分鐘 (0-59)30
secondss, s秒 (0-59)45
millisecondms毫秒 (0-999)123
microsecondmcs微秒 (0-999999)123456
nanosecondns奈秒 (0-999999999)123456789
iso_weekisowk, isowwISO 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 vs DATEPART vs FORMAT

函數回傳型別語言相依適用場景
DATENAMENVARCHAR是 (月份/星期名稱)報表顯示、需語言化名稱
DATEPARTINT否計算、比較、分組、WHERE 條件
FORMATNVARCHAR是 (可指定 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:WHERE DATENAME(weekday, CreatedAt) = N'星期一'
  • ETL 維度表:產生時間維度表的月份名稱、季度、週別欄位
  • 稽核日誌:記錄人類可讀的時間戳記

效能提醒

DATENAME 為純量函數,大量資料列呼叫會影響效能。若在 WHERE/JOIN/GROUP BY 大量使用,建議:

  1. 改用 DATEPART (INT) 比較/分組
  2. 或建立計算欄位 + 索引
  3. 或在應用層格式化

善用 DATENAME 的語言化特性,配合 DATEPART 計算優勢與 FORMAT 格式化彈性,能涵蓋絕大多數日期時間顯示與邏輯需求。

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