前言
写sql时经常用到时间处理函数,我整理了一份mysql的常用sql笔记,供大家参考。
如果对你有帮助,请点赞支持~ 多谢🙏
笔记
sql
-- MySQL 时间处理函数和操作符笔记
-- 1. 获取当前日期和时间
-- NOW(), SYSDATE(), CURRENT_TIMESTAMP(), CURDATE(), CURTIME()
SELECT NOW(); -- 当前日期和时间(函数执行时)
SELECT SYSDATE(); -- 当前日期和时间(语句执行时,与NOW()不同)
SELECT CURRENT_TIMESTAMP(); -- 同NOW()
SELECT CURDATE(); -- 当前日期(不带时间)
SELECT CURTIME(); -- 当前时间(不带日期)
-- 2. 时间类型转换
-- DATE(), TIME(), DATETIME(), STR_TO_DATE(), DATE_FORMAT()
SELECT DATE('2023-01-01 12:00:00'); -- 提取日期部分
SELECT TIME('2023-01-01 12:00:00'); -- 提取时间部分
SELECT STR_TO_DATE('01,01,2023', '%d,%m,%Y'); -- 字符串转日期
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- 格式化输出
-- 3. 提取时间部分
-- YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND()
SELECT YEAR(NOW()); -- 提取年份
SELECT MONTH(NOW()); -- 提取月份
SELECT DAY(NOW()); -- 提取日
SELECT HOUR(NOW()); -- 提取小时
SELECT MINUTE(NOW()); -- 提取分钟
SELECT SECOND(NOW()); -- 提取秒数
-- 4. 时间运算
-- DATE_ADD(), DATE_SUB(), + INTERVAL, - INTERVAL
SELECT DATE_ADD(CURDATE(), INTERVAL 1 DAY); -- 加1天
SELECT DATE_SUB(CURDATE(), INTERVAL 1 MONTH); -- 减1个月
SELECT CURDATE() + INTERVAL 2 HOUR; -- 加2小时
SELECT NOW() - INTERVAL 30 MINUTE; -- 减30分钟
-- 5. 时间差计算
-- DATEDIFF(), TIMEDIFF(), TIMESTAMPDIFF()
SELECT DATEDIFF('2023-01-10', '2023-01-01'); -- 日期差(天)
SELECT TIMEDIFF('12:00:00', '08:30:00'); -- 时间差(HH:MM:SS)
SELECT TIMESTAMPDIFF(HOUR, '2023-01-01', '2023-01-02'); -- 指定单位差值
-- 6. 时间截断
-- DATE(), TIME(), EXTRACT(), TIMESTAMP()
SELECT DATE(NOW()); -- 截断为日期
SELECT TIME(NOW()); -- 截断为时间
SELECT EXTRACT(YEAR_MONTH FROM NOW()); -- 提取年月
SELECT TIMESTAMP(NOW()); -- 转换为时间戳
-- 7. 时间格式化
-- DATE_FORMAT() 模式
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); -- 2023-01-01
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日'); -- 2023年01月01日
SELECT DATE_FORMAT(NOW(), '%H:%i:%s'); -- 14:30:45
SELECT DATE_FORMAT(NOW(), '%W, %M %d %Y'); -- 星期几, 月名 日 年
-- 8. 生成时间序列
-- 使用递归CTE或辅助表(MySQL 8.0+)
WITH RECURSIVE date_series AS (
SELECT '2023-01-01' AS date
UNION ALL
SELECT date + INTERVAL 1 DAY FROM date_series
WHERE date < '2023-01-10'
)
SELECT * FROM date_series;
-- 9. 时间比较
-- 常规比较操作符(>, <, =, >=, <=)
SELECT CURDATE() > '2023-01-01'; -- 日期比较
SELECT NOW() BETWEEN '2023-01-01' AND '2023-12-31'; -- 范围比较
-- 10. 特殊时间值
-- UNIX_TIMESTAMP(), FROM_UNIXTIME()
SELECT UNIX_TIMESTAMP(); -- 当前UNIX时间戳
SELECT UNIX_TIMESTAMP('2023-01-01'); -- 指定日期时间戳
SELECT FROM_UNIXTIME(1672531200); -- 时间戳转日期时间
-- 11. 时间函数
-- LAST_DAY(), MAKEDATE(), MAKETIME(), PERIOD_ADD()
SELECT LAST_DAY('2023-02-01'); -- 当月最后一天
SELECT MAKEDATE(2023, 1); -- 创建日期(2023年第1天)
SELECT MAKETIME(12, 30, 0); -- 创建时间
SELECT PERIOD_ADD(202301, 5); -- 增加5个月(格式YYMM或YYYYMM)
-- 12. 时区处理
-- CONVERT_TZ() (需要时区表支持)
SELECT CONVERT_TZ(NOW(), '+00:00', '+08:00'); -- 转换时区
-- 13. 星期相关函数
-- DAYOFWEEK(), DAYOFYEAR(), WEEK(), WEEKOFYEAR(), YEARWEEK()
SELECT DAYOFWEEK('2023-01-01'); -- 星期几(1=周日,7=周六)
SELECT DAYOFYEAR('2023-01-01'); -- 一年中的第几天
SELECT WEEK('2023-01-01'); -- 一年中的第几周
SELECT WEEKOFYEAR('2023-01-01');-- 同WEEK()
SELECT YEARWEEK('2023-01-01'); -- 年份和周数
-- 14. 季度计算
-- QUARTER()
SELECT QUARTER('2023-04-01'); -- 返回2(第二季度)
-- 15. 时间戳处理
-- TIMESTAMP(), TIMESTAMPADD(), TIMESTAMPDIFF()
SELECT TIMESTAMP('2023-01-01'); -- 转换为时间戳
SELECT TIMESTAMPADD(MINUTE, 30, '2023-01-01 12:00:00'); -- 增加30分钟
SELECT TIMESTAMPDIFF(MONTH, '2023-01-01', '2023-06-01'); -- 月份差