NOW()(推薦)SELECT NOW(); -- 2008-08-08 22:20:46
同義函數:CURRENT_TIMESTAMP()、LOCALTIME()、LOCALTIMESTAMP() 等,統一用 NOW() 簡短易記。
SYSDATE()NOW() 在語句開始執行時固定值;SYSDATE() 在函數執行瞬間取值:
SELECT NOW(), SLEEP(3), NOW(); -- 兩次 NOW() 相同
SELECT SYSDATE(), SLEEP(3), SYSDATE(); -- 相差 3 秒
一般極少用 SYSDATE()。
CURDATE() | 僅時間:CURTIME()SELECT CURDATE(); -- 2008-08-08
SELECT CURTIME(); -- 22:41:30
同義:CURRENT_DATE()、CURRENT_TIME()。
UTC_DATE()、UTC_TIME()、UTC_TIMESTAMP()SELECT UTC_TIMESTAMP(), UTC_DATE(), UTC_TIME(), NOW();
-- UTC 比北京時間(東八區)早 8 小時
跨時區業務必用 UTC 存儲,顯示時轉換。
SET @dt = '2008-09-10 07:15:30.123456';
SELECT DATE(@dt); -- 2008-09-10
SELECT TIME(@dt); -- 07:15:30.123456
SELECT YEAR(@dt); -- 2008
SELECT QUARTER(@dt); -- 3
SELECT MONTH(@dt); -- 9
SELECT WEEK(@dt); -- 36
SELECT DAY(@dt); -- 10
SELECT HOUR(@dt); -- 7
SELECT MINUTE(@dt); -- 15
SELECT SECOND(@dt); -- 30
SELECT MICROSECOND(@dt); -- 123456
EXTRACT() — 功能最全
SELECT EXTRACT(YEAR_MONTH FROM @dt); -- 200809
SELECT EXTRACT(DAY_HOUR FROM @dt); -- 1007
SELECT EXTRACT(DAY_MINUTE FROM @dt); -- 100715
SELECT EXTRACT(DAY_SECOND FROM @dt); -- 10071530
SELECT EXTRACT(DAY_MICROSECOND FROM @dt);-- 10071530123456
SELECT EXTRACT(HOUR_MINUTE FROM @dt); -- 715
SELECT EXTRACT(HOUR_SECOND FROM @dt); -- 71530
SELECT EXTRACT(HOUR_MICROSECOND FROM @dt);-- 71530123456
SELECT EXTRACT(MINUTE_SECOND FROM @dt); -- 1530
SELECT EXTRACT(MINUTE_MICROSECOND FROM @dt);-- 1530123456
SELECT EXTRACT(SECOND_MICROSECOND FROM @dt);-- 30123456
優勢: 支持組合提取(如 DAY_MICROSECOND 從天到微秒),缺點是輸入較長。
DAYOFWEEK()、DAYOFMONTH()、DAYOFYEAR()
SET @dt = '2008-08-08';
SELECT DAYOFWEEK(@dt); -- 6 (1=周日)
SELECT DAYOFMONTH(@dt); -- 8
SELECT DAYOFYEAR(@dt); -- 221
WEEK()、WEEKOFYEAR()、WEEKDAY()、YEARWEEK()
SELECT WEEK(@dt); -- 31
SELECT WEEK(@dt, 3); -- 32 (模式3)
SELECT WEEKOFYEAR(@dt); -- 32 等同 WEEK(@dt,3)
SELECT WEEKDAY(@dt); -- 4 (0=周一)
SELECT YEARWEEK(@dt); -- 200831
DAYNAME()、MONTHNAME()
SELECT DAYNAME(@dt); -- Friday
SELECT MONTHNAME(@dt); -- August
中文名稱需應用層映射或 ELT() 實現。
LAST_DAY()
SELECT LAST_DAY('2008-02-01'); -- 2008-02-29 (閏年)
SELECT LAST_DAY('2008-08-08'); -- 2008-08-31
-- 獲取當月天數:
SELECT DAY(LAST_DAY(NOW()));
DATE_ADD()(推薦統一用此函數)
SET @dt = NOW();
SELECT DATE_ADD(@dt, INTERVAL 1 DAY);
SELECT DATE_ADD(@dt, INTERVAL 1 HOUR);
SELECT DATE_ADD(@dt, INTERVAL 1 MINUTE);
SELECT DATE_ADD(@dt, INTERVAL 1 SECOND);
SELECT DATE_ADD(@dt, INTERVAL 1 WEEK);
SELECT DATE_ADD(@dt, INTERVAL 1 MONTH);
SELECT DATE_ADD(@dt, INTERVAL 1 QUARTER);
SELECT DATE_ADD(@dt, INTERVAL 1 YEAR);
SELECT DATE_ADD(@dt, INTERVAL -1 DAY); -- 減去
-- 複合間隔:
SELECT DATE_ADD(@dt, INTERVAL '01:15:30' HOUR_SECOND); -- +1時15分30秒
SELECT DATE_ADD(@dt, INTERVAL '1 01:15:30' DAY_SECOND); -- +1天1時15分30秒
ADDDATE()、ADDTIME() 可用 DATE_ADD() 替代。
DATE_SUB()
SELECT DATE_SUB('1998-01-01 00:00:00', INTERVAL '1 1:1:1' DAY_SECOND);
-- 1997-12-30 22:58:59
SUBDATE()、SUBTIME() 同理用 DATE_SUB() 替代。
PERIOD_ADD()、PERIOD_DIFF()(較少用)
SELECT PERIOD_ADD(200808, 2); -- 200810
SELECT PERIOD_ADD(20080808, -2); -- 20080806
SELECT PERIOD_DIFF(200808, 200801); -- 7
DATEDIFF()、TIMEDIFF()
SELECT DATEDIFF('2008-08-08', '2008-08-01'); -- 7
SELECT DATEDIFF('2008-08-01', '2008-08-08'); -- -7
SELECT TIMEDIFF('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
-- TIMEDIFF 參數類型必須相同
TIME_TO_SEC()、SEC_TO_TIME()
SELECT TIME_TO_SEC('01:00:05'); -- 3605
SELECT SEC_TO_TIME(3605); -- '01:00:05'
TO_DAYS()、FROM_DAYS()
SELECT TO_DAYS('2008-08-08'); -- 733627
SELECT FROM_DAYS(733627); -- '2008-08-08'
STR_TO_DATE(str, format)
SELECT STR_TO_DATE('08/09/2008', '%m/%d/%Y'); -- 2008-08-09
SELECT STR_TO_DATE('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30
格式符參考手冊,極其靈活。
DATE_FORMAT()、TIME_FORMAT()
SELECT DATE_FORMAT('2008-08-08 22:23:00', '%W %M %Y'); -- Friday August 2008
SELECT DATE_FORMAT('2008-08-08 22:23:01', '%Y%m%d%H%i%s'); -- 20080808222301
SELECT TIME_FORMAT('22:23:01', '%H.%i.%s'); -- 22.23.01
與 STR_TO_DATE 互為逆操作。
GET_FORMAT()(了解即可)
SELECT GET_FORMAT(DATE, 'USA'); -- '%m.%d.%Y'
SELECT GET_FORMAT(DATETIME, 'ISO'); -- '%Y-%m-%d %H:%i:%s'
MAKEDATE()、MAKETIME()
SELECT MAKEDATE(2001, 31); -- '2001-01-31'
SELECT MAKETIME(12, 15, 30); -- '12:15:30'
CURRENT_TIMESTAMPUNIX_TIMESTAMP()、FROM_UNIXTIME()
SELECT UNIX_TIMESTAMP(); -- 1218290027
SELECT UNIX_TIMESTAMP('2008-08-08'); -- 1218124800
SELECT FROM_UNIXTIME(1218290027); -- '2008-08-09 21:53:47'
SELECT FROM_UNIXTIME(1218169800, '%Y %D %M %h:%i:%s %x'); -- '2008 8th August 12:30:00 2008'
TIMESTAMP()、TIMESTAMPADD()、TIMESTAMPDIFF()
SELECT TIMESTAMP('2008-08-08'); -- 2008-08-08 00:00:00
SELECT TIMESTAMP('2008-08-08 08:00:00', '01:01:01'); -- 2008-08-08 09:01:01
SELECT TIMESTAMPADD(DAY, 1, '2008-08-08 08:00:00'); -- 2008-08-09 08:00:00
SELECT TIMESTAMPDIFF(YEAR, '2002-05-01', '2001-01-01'); -- -1
SELECT TIMESTAMPDIFF(DAY, '2002-05-01', '2001-01-01'); -- -485
-- TIMESTAMPDIFF 比 DATEDIFF 強大,支持任意單位
CONVERT_TZ(dt, from_tz, to_tz)
SELECT CONVERT_TZ('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00
-- 等價於:
SELECT DATE_ADD('2008-08-08 12:00:00', INTERVAL -8 HOUR);
SELECT TIMESTAMPADD(HOUR, -8, '2008-08-08 12:00:00');
NOW()DATE_ADD()/DATE_SUB()DATE_FORMAT()CONVERT_TZ 或間隔計算轉換FROM_UNIXTIME()/UNIX_TIMESTAMP()TIMESTAMPDIFF()