一、日期時間函數
1. 時間與秒互轉
| 函數 | 說明 | 示例 | 結果 |
TIME_TO_SEC(time) | 時間轉總秒數 | TIME_TO_SEC('01:01:01') | 3661 |
SEC_TO_TIME(seconds) | 秒數轉時間 | SEC_TO_TIME(3661) | '01:01:01' |
2. 日期與天數互轉
| 函數 | 說明 | 示例 | 結果 |
TO_DAYS(date) | 日期轉天數(從年份 0 開始) | TO_DAYS('0001-01-01') | 366 |
FROM_DAYS(days) | 天數轉日期 | FROM_DAYS(366) | '0001-01-01' |
3. 字符串與日期互轉
| 函數 | 說明 | 示例 |
STR_TO_DATE(str, format) | 按格式解析字符串為日期 | STR_TO_DATE('2013-01-01 01:21:01', '%Y-%m-%d %H:%i:%s') |
DATE_FORMAT(date, format) | 日期格式化為字符串 | DATE_FORMAT('2013-01-01 01:21:01', '%Y%m%d %H%i%s') → '20130101 012101' |
TIME_FORMAT(time, format) | 時間格式化為字符串 | TIME_FORMAT('01:21:01', '%H%i%s') → '012101' |
4. 常用格式符號速查表
| 符號 | 含義 |
| %Y | 4位年份 |
| %m | 月份 (01-12) |
| %d | 日期 (00-31) |
| %H | 小時 24制 (00-23) |
| %i | 分鐘 (00-59) |
| %s | 秒 (00-59) |
| %W | 星期名稱 (Sunday...) |
| %M | 月份名稱 (January...) |
| %% | 字面 % 符號 |
5. 日期成分提取函數
| 函數 | 說明 | 示例 (假設 NOW() = '2013-05-16 16:31:34') |
DATE(expr) | 提取日期部分 | '2013-05-16' |
YEAR(expr) | 年份 | 2013 |
MONTH(expr) | 月份 | 5 |
DAY(expr) | 日期 | 16 |
HOUR(expr) | 小時 | 16 |
MINUTE(expr) | 分鐘 | 31 |
SECOND(expr) | 秒 | 34 |
WEEKDAY(expr) | 星期索引 (0=周一) | 3 (周四) |
WEEK(expr[,mode]) | 一年中的週數 | 19/20 (mode=0/1) |
QUARTER(expr) | 季度 (1-4) | 2 |
DAYOFWEEK(expr) | 星期索引 (1=周日) | 5 |
DAYOFMONTH(expr) | 月中的天 | 16 |
DAYOFYEAR(expr) | 年中的天 | 136 |
DAYNAME(expr) | 星期名稱 | 'Thursday' |
MONTHNAME(expr) | 月份名稱 | 'May' |
6. 當前日期時間獲取
| 函數 | 說明 | 差異 |
NOW() | 語句開始執行時間 | 語句內多次調用返回相同值 |
SYSDATE() | 實時獲取時間 | 語句內多次調用可能不同 |
CURDATE() | 當前日期 | 字符串語境 'YYYY-MM-DD' |
CURTIME() | 當前時間 | 字符串語境 'HH:MM:SS' |
CURRENT_TIMESTAMP() | 同 NOW() | 標準 SQL 函數 |
7. Unix 時間戳互轉
| 函數 | 說明 | 示例 |
UNIX_TIMESTAMP([date]) | 日期轉時間戳 (秒) | UNIX_TIMESTAMP('2013-05-16 01:01:01') → 1368637261 |
FROM_UNIXTIME(ts[,format]) | 時間戳轉日期 | FROM_UNIXTIME(1368637261) → '2013-05-16 01:01:01' |
8. 日期運算
DATE_ADD(date, INTERVAL expr unit) -- 加法
DATE_SUB(date, INTERVAL expr unit) -- 減法
常用單位:SECOND, MINUTE, HOUR, DAY, MONTH, YEAR, DAY_SECOND, DAY_MINUTE, DAY_HOUR, YEAR_MONTH 等。
| 示例 | 結果 |
DATE_ADD('2013-05-16 01:01:01', INTERVAL 1 DAY) | '2013-05-17 01:01:01' |
DATE_ADD('2013-05-16 01:01:01', INTERVAL '1 1:1:1' DAY_SECOND) | '2013-05-17 02:02:02' |
9. 日期差值
| 函數 | 說明 | 示例 |
DATEDIFF(date1, date2) | 日期差天數 (忽略時間) | DATEDIFF('2013-05-16', '2013-05-17') → -1 |
TIMEDIFF(time1, time2) | 時間差 (HH:MM:SS) | TIMEDIFF('00:00:00', '11:11:11') → '-11:11:11' |
10. 月末日期
LAST_DAY(date) -- 返回該月最後一天
11. 日期類型對比
在 WHERE 條件中可直接使用字符串字面量與日期列比較:
SELECT * FROM tab WHERE createtime > '2013-05-14 00:00:00';
SELECT * FROM tab WHERE createtime BETWEEN '2013-05-14' AND '2013-05-15';
二、數值函數
| 函數 | 說明 | 示例 | 結果 |
ABS(x) | 絕對值 | ABS(-2) | 2 |
FLOOR(x) | 向下取整 | FLOOR(-2.45) | -3 |
MOD(n,m) | 取模 (余數) | MOD(3,2) | 1 |
RAND([seed]) | 隨機數 0-1 | RAND(2) | 0.6555... (固定種子可重現) |
ROUND(x[,d]) | 四捨五入 | ROUND(2.432,2) / ROUND(12.432,-1) | 2.43 / 10 |
使用建議
- 日期比較優先使用字符串字面量 'YYYY-MM-DD',可讀性強且利用索引。
NOW() vs SYSDATE():存儲過程/觸發器中需實時時間用 SYSDATE()。
ROUND(x, -n) 可用於金額按 10/100/1000 取整。
RAND(seed) 固定種子可用於測試數據生成的可重現性。
掌握這些核心函數,能顯著提升 SQL 編寫效率與可讀性。