萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 日期時間函數速查:CURDATE、NOW、DATE_FORMAT 與元件提取完整指南

當前日期時間取得

函數回傳型別範例輸出說明
NOW() / SYSDATE()DATETIME2024-01-15 14:30:45NOW() 為語句執行開始時間,SYSDATE() 為函數執行瞬間時間
CURDATE() / CURRENT_DATE()DATE2024-01-15僅日期部分
CURTIME() / CURRENT_TIME()TIME14:30:45僅時間部分
UTC_DATE(), UTC_TIME(), UTC_TIMESTAMP()對應型別...UTC 時間,跨時區應用必備

日期元件提取函數


SELECT 
    YEAR(CURDATE())    AS Year,      -- 2024
    MONTH(CURDATE())   AS Month,     -- 1
    DAY(CURDATE())     AS Day,       -- 15
    DAYOFMONTH(CURDATE()) AS DayOfMonth, -- 15 (同 DAY)
    DAYOFWEEK(CURDATE())  AS DayOfWeek,  -- 2 (1=Sunday)
    DAYOFYEAR(CURDATE())  AS DayOfYear,  -- 15
    WEEK(CURDATE())      AS Week,      -- 3
    MONTHNAME(CURDATE()) AS MonthName, -- January
    QUARTER(CURDATE())   AS Quarter;   -- 1

格式化輸出:DATE_FORMAT (最強大、最常用)


SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- 2024-01-15 14:30:45 (標準日期時間)
SELECT DATE_FORMAT(NOW(), '%Y%m%d');            -- 20240115 (檔名/分區鍵)
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');          -- 2024-01-15
SELECT DATE_FORMAT(NOW(), '%H:%i:%s');          -- 14:30:45
SELECT DATE_FORMAT(NOW(), '%W, %M %d, %Y');     -- Monday, January 15, 2024
SELECT DATE_FORMAT(NOW(), '%r');                -- 02:30:45 PM (12小時制)

常用格式符號速查

符號含義範例
%Y4 位數年份2024
%y2 位數年份24
%m月份 (01-12)01
%c月份 (1-12)1
%d日期 (01-31)15
%e日期 (1-31)15
%H小時 24制 (00-23)14
%h / %I小時 12制 (01-12)02
%i分鐘 (00-59)30
%s / %S秒 (00-59)45
%pAM/PMPM
%W星期名稱Monday
%a星期縮寫Mon
%M月份名稱January
%b月份縮寫Jan
%j年間天數 (001-366)015
%U週數 (00-53, Sunday first)03
%u週數 (00-53, Monday first)03

日期運算與邊界計算


-- 日期加減
SELECT DATE_ADD(CURDATE(), INTERVAL 1 DAY);     -- 明天
SELECT DATE_SUB(CURDATE(), INTERVAL 1 MONTH);   -- 上個月同一天
SELECT CURDATE() + INTERVAL 7 DAY;              -- 簡寫 (僅 DATE/DATETIME)

-- 當月第一天 / 最後一天
SELECT DATE_FORMAT(CURDATE(), '%Y-%m-01');      -- 2024-01-01
SELECT LAST_DAY(CURDATE());                     -- 2024-01-31

-- 當週一 / 週日
SELECT DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE())) DAY); -- 本週一
SELECT DATE_ADD(CURDATE(), INTERVAL (6 - WEEKDAY(CURDATE())) DAY); -- 本週日

時區處理


-- 會話級時區
SET time_zone = '+08:00'; -- 或 'Asia/Taipei' (需載入時區表 mysql_tzinfo_to_sql)

-- 轉換時區
SELECT CONVERT_TZ(NOW(), '+00:00', '+08:00'); -- UTC 轉台北時間

效能建議

  • **WHERE 條件避免函數包裹欄位**:`WHERE DATE(created_at) = CURDATE()` → 索引失效。
    改寫:`WHERE created_at >= CURDATE() AND created_at < DATE_ADD(CURDATE(), INTERVAL 1 DAY)`。
  • 大量資料格式化輸出建議在**應用層**處理,減輕資料庫 CPU。
copyright © 萬盛學電腦網 all rights reserved