悠悠楠杉
MySQL时间戳转日期格式与WHERE条件查询实战指南
一、时间戳转日期的核心方法
MySQL处理时间戳转换主要依赖三个函数族:
基础转换函数
sql SELECT FROM_UNIXTIME(1633046400); -- 输出:2021-10-01 00:00:00 SELECT UNIX_TIMESTAMP('2023-05-20 14:30:00'); -- 反向转换
格式化输出(最常用场景)
sql SELECT DATE_FORMAT(FROM_UNIXTIME(create_time), '%Y-%m-%d %H:%i:%s') FROM orders WHERE user_id = 1001;
支持的全部格式符:
- %Y
:4位年(2023)
- %y
:2位年(23)
- %M
:月份全称(January)
- %b
:缩写月份(Jan)
- 时区转换技巧
sql SET time_zone = '+8:00'; SELECT CONVERT_TZ(FROM_UNIXTIME(1672502400),'+00:00','+08:00');
二、WHERE条件查询的黄金法则
- 时间范围查询优化方案sql
-- 好的写法(利用索引)
SELECT * FROM logs
WHERE create_time BETWEEN '2023-01-01' AND '2023-01-31';
-- 避免的写法(索引失效)
SELECT * FROM logs
WHERE YEAR(createtime) = 2023 AND MONTH(createtime) = 1;
多条件组合的优先级控制
sql -- 使用括号明确优先级 SELECT * FROM products WHERE (category = 'electronics' OR price > 500) AND stock_count > 0;
NULL值处理的注意事项
sql -- 正确检测NULL SELECT * FROM users WHERE phone IS NULL; -- 错误写法(不会返回结果) SELECT * FROM users WHERE phone = NULL;
三、高频实战场景解析
最近30天活跃用户查询
sql SELECT user_id, COUNT(*) AS activity_count FROM user_actions WHERE action_time >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) GROUP BY user_id ORDER BY activity_count DESC;
跨时区数据统计
sql SELECT DATE_FORMAT(CONVERT_TZ(FROM_UNIXTIME(log_time),'+00:00','+08:00'), '%H:00') AS hour, COUNT(*) AS requests FROM api_logs GROUP BY hour;
日期范围与索引的相爱相杀sql
-- 建立优化索引
ALTER TABLE transactions ADD INDEX idxdateamount (transaction_date, amount);
-- 索引生效的查询
SELECT * FROM transactions
WHERE transaction_date BETWEEN '2023-01-01' AND '2023-01-31'
AND amount > 1000;
四、性能优化冷知识
隐式类型转换陷阱
sql -- 字符串与数字比较(导致索引失效) SELECT * FROM products WHERE product_code = 10045; -- 应改为 SELECT * FROM products WHERE product_code = '10045';
BETWEEN的边界争议sql
-- 包含边界值
SELECT * FROM events
WHERE event_time BETWEEN '2023-06-01 00:00:00' AND '2023-06-30 23:59:59';
-- 更精确的写法
SELECT * FROM events
WHERE eventtime >= '2023-06-01'
AND eventtime < '2023-07-01';
- 大数据量分页优化sql
-- 传统分页(越往后越慢)
SELECT * FROM large_table LIMIT 1000000, 20;
-- 优化方案(利用主键)
SELECT * FROM large_table
WHERE id > 1000000
ORDER BY id LIMIT 20;