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

SQL 截取日期部分的兩種高效方法:字串組裝與日期運算

     編輯:MySQL 綜合教學

SQL 獲取日期「年/月/日」部分的兩大流派

統計報表常需按年、月、日分組,但資料欄位精確到秒。以下兩種方法各有優勢。

方法一:字串組裝法(直觀但依賴隱含轉換)

-- 取得「年-月-日 00:00:00」日期時間值
CAST(
  STR(YEAR(GETDATE())) + '/' +
  STR(MONTH(GETDATE())) + '/' +
  STR(DAY(GETDATE()))
AS DATETIME)

-- 僅需年月
CAST(
  STR(YEAR(GETDATE())) + '/' +
  STR(MONTH(GETDATE())) + '/01'
AS DATETIME)

優點:邏輯直觀,易讀。
缺點:隱含字串→日期轉換受語言/地區設定影響,跨環境可能失效;性能略低。

方法二:日期運算法(高效、標準、索引友善)

-- 取得「本月第一天 00:00:00」
DATEADD(month, DATEDIFF(month, 0, ColTime), 0)

-- 取得「今天零點」
DATEADD(day, DATEDIFF(day, 0, ColTime), 0)

-- 取得「本年第一天」
DATEADD(year, DATEDIFF(year, 0, ColTime), 0)

核心原理:DATEDIFF(interval, 0, ColTime) 計算基準日 1900-01-01 到目標日期的間隔數,再用 DATEADD 加回基準日,直接得到該間隔的「起始邊界」。

優勢:

  • 純日期運算,無字串轉換開銷,執行計畫更優。
  • 結果為標準 DATETIME,可直接參與索引範圍查詢(SARGable)。
  • 不受語言/日期格式設定影響,跨庫移植性極佳。

實戰建議

報表分組查詢 推薦方法二,配合 GROUP BY DATEADD(month, DATEDIFF(month, 0, create_time), 0) 既高效又能利用索引。
前端顯示格式化 交由應用層或 CONVERT/FORMAT 處理,資料庫只負責邊界計算。

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