news 2026/10/15 19:49:38

MySQL timestamp

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL timestamp

TL’DR

  • 经常使用的字段,加上索引
  • 尽量不要对字段进行函数运算

在 MySQL 中比较 timestamp 和固定时间有几种常用方法:

1. 直接比较(推荐)

-- 比较是否大于某个时间SELECT*FROMtable_nameWHEREtimestamp_column>'2024-01-01 10:30:00';-- 比较是否在某个时间范围内SELECT*FROMtable_nameWHEREtimestamp_columnBETWEEN'2024-01-01 00:00:00'AND'2024-12-31 23:59:59';-- 比较是否等于某个时间SELECT*FROMtable_nameWHEREtimestamp_column='2024-01-01 10:30:00';

2. 使用 UNIX_TIMESTAMP 函数

-- 转换为 Unix 时间戳比较SELECT*FROMtable_nameWHEREUNIX_TIMESTAMP(timestamp_column)>UNIX_TIMESTAMP('2024-01-01 10:30:00');-- 或者直接用数字(秒数)SELECT*FROMtable_nameWHEREUNIX_TIMESTAMP(timestamp_column)>1704081000;

3. 使用 DATE/DATETIME 函数

-- 只比较日期部分SELECT*FROMtable_nameWHEREDATE(timestamp_column)='2024-01-01';-- 使用 STR_TO_DATE 转换字符串SELECT*FROMtable_nameWHEREtimestamp_column>STR_TO_DATE('2024-01-01 10:30:00','%Y-%m-%d %H:%i:%s');

4. 常用比较场景

-- 查询最近24小时的数据SELECT*FROMtable_nameWHEREtimestamp_column>NOW()-INTERVAL24HOUR;-- 查询今天的数据SELECT*FROMtable_nameWHEREDATE(timestamp_column)=CURDATE();-- 查询本周的数据SELECT*FROMtable_nameWHEREYEARWEEK(timestamp_column)=YEARWEEK(NOW());-- 查询指定时间之后的数据SELECT*FROMtable_nameWHEREtimestamp_column>='2024-01-01 00:00:00';

注意事项:

  1. 时区问题:TIMESTAMP 类型会根据数据库时区自动转换,确保你的固定时间是在正确的时区
  2. 格式:MySQL 接受'YYYY-MM-DD HH:MM:SS'格式的字符串
  3. 性能:直接比较(方法1)通常性能最好,能利用索引
  4. 函数使用:在 WHERE 子句中对列使用函数(如 DATE())会导致无法使用索引,影响性能

最常用和推荐的方式是方法1,直接使用字符串格式比较,简单且高效。

要查询 MySQL 中最近三个月的created_at数据(timestamp 格式),可以使用以下几种方法:

1. 使用 INTERVAL(最常用)

-- 查询最近3个月的数据SELECT*FROMtable_nameWHEREcreated_at>=NOW()-INTERVAL3MONTH;-- 或使用 DATE_SUBSELECT*FROMtable_nameWHEREcreated_at>=DATE_SUB(NOW(),INTERVAL3MONTH);-- 更精确:从今天往前推3个月SELECT*FROMtable_nameWHEREcreated_at>=CURDATE()-INTERVAL3MONTH;

2. 指定具体时间范围

-- 最近3个月到现在SELECT*FROMtable_nameWHEREcreated_atBETWEENDATE_SUB(NOW(),INTERVAL3MONTH)ANDNOW();-- 只计算完整的月份(例如:如果现在是 12-31,查询 10-01 到 12-31)SELECT*FROMtable_nameWHEREcreated_at>=DATE_FORMAT(NOW()-INTERVAL3MONTH,'%Y-%m-01');

3. 使用 TIMESTAMPDIFF(更灵活)

-- 查询距离现在不超过3个月的数据SELECT*FROMtable_nameWHERETIMESTAMPDIFF(MONTH,created_at,NOW())<=3;

4. 实际应用示例

-- 统计最近3个月的记录数SELECTCOUNT(*)FROMtable_nameWHEREcreated_at>=NOW()-INTERVAL3MONTH;-- 按月分组统计最近3个月数据SELECTDATE_FORMAT(created_at,'%Y-%m')asmonth,COUNT(*)ascountFROMtable_nameWHEREcreated_at>=NOW()-INTERVAL3MONTHGROUPBYDATE_FORMAT(created_at,'%Y-%m')ORDERBYmonth;-- 最近3个月,按日期倒序排列SELECT*FROMtable_nameWHEREcreated_at>=NOW()-INTERVAL3MONTHORDERBYcreated_atDESC;

推荐方案:

SELECT*FROMtable_nameWHEREcreated_at>=NOW()-INTERVAL3MONTH;

这个查询会:

  • ✅ 自动计算从当前时间往前推 3 个月
  • ✅ 包含时分秒,更精确
  • ✅ 可以利用 created_at 上的索引(如果有)
  • ✅ 简单易读

注意:如果created_at列上有索引,确保不要在列上使用函数(如DATE(created_at)),否则会导致索引失效。

如果created_at存储的是 Unix 时间戳(数字格式),可以这样查询:

1. 直接比较时间戳数字(最高效)

-- 查询最近3个月的数据SELECT*FROMtable_nameWHEREcreated_at>=UNIX_TIMESTAMP(NOW()-INTERVAL3MONTH);-- 或者直接计算秒数(3个月约等于 7776000 秒)SELECT*FROMtable_nameWHEREcreated_at>=UNIX_TIMESTAMP()-(3*30*24*60*60);

2. 使用 FROM_UNIXTIME 转换后比较

-- 将时间戳转换为日期时间后比较SELECT*FROMtable_nameWHEREFROM_UNIXTIME(created_at)>=NOW()-INTERVAL3MONTH;-- 注意:这种方式会影响索引性能

3. 推荐方案(性能最好)

-- 计算3个月前的时间戳,直接比较数字SELECT*FROMtable_nameWHEREcreated_at>=UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL3MONTH));

4. 实际示例

-- 查询最近3个月的数据,按时间倒序SELECT*,FROM_UNIXTIME(created_at)asreadable_timeFROMtable_nameWHEREcreated_at>=UNIX_TIMESTAMP(NOW()-INTERVAL3MONTH)ORDERBYcreated_atDESC;-- 按月统计最近3个月的数据SELECTDATE_FORMAT(FROM_UNIXTIME(created_at),'%Y-%m')asmonth,COUNT(*)ascountFROMtable_nameWHEREcreated_at>=UNIX_TIMESTAMP(NOW()-INTERVAL3MONTH)GROUPBYDATE_FORMAT(FROM_UNIXTIME(created_at),'%Y-%m')ORDERBYmonth;

性能对比:

-- ✅ 好:在 WHERE 中不对列使用函数,可以利用索引WHEREcreated_at>=UNIX_TIMESTAMP(NOW()-INTERVAL3MONTH)-- ❌ 差:对列使用函数会导致索引失效WHEREFROM_UNIXTIME(created_at)>=NOW()-INTERVAL3MONTH

最佳实践:

SELECT*FROMtable_nameWHEREcreated_at>=UNIX_TIMESTAMP(NOW()-INTERVAL3MONTH);

优势:

  • ✅ 数字比较速度快
  • ✅ 可以利用 created_at 索引
  • ✅ 精确计算3个月
  • ✅ 语义清晰

注意:UNIX_TIMESTAMP()返回的是秒级时间戳。如果你的created_at是毫秒级时间戳,需要乘以 1000:

WHEREcreated_at>=UNIX_TIMESTAMP(NOW()-INTERVAL3MONTH)*1000
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 23:18:46

YOLOv8推理速度测试:不同GPU下的FPS表现汇总

YOLOv8推理速度测试&#xff1a;不同GPU下的FPS表现汇总 在智能监控、自动驾驶和工业质检等实际场景中&#xff0c;目标检测的实时性往往直接决定了系统的可用性。一个精度再高的模型&#xff0c;如果推理延迟过高导致无法满足帧率要求&#xff0c;也难以落地部署。近年来&…

作者头像 李华
网站建设 2026/10/15 14:14:08

YOLOv8图片上传组件设计:支持批量拖拽

YOLOv8图片上传组件设计&#xff1a;支持批量拖拽 在深度学习项目中&#xff0c;尤其是目标检测这类依赖大量图像输入的任务里&#xff0c;数据准备往往是第一步&#xff0c;也常常是最繁琐的一步。尽管YOLOv8已经极大简化了模型训练与推理流程&#xff0c;但在实际使用过程中&…

作者头像 李华
网站建设 2026/10/15 4:31:59

YOLOv8版本控制建议:Git Commit管理实验代码

YOLOv8 实验代码的 Git 版本管理实践&#xff1a;让每一次训练都可追溯 在深度学习项目中&#xff0c;一个常见的场景是&#xff1a;你上周跑出了一组不错的结果&#xff0c;mAP 达到了 0.72。今天你想在此基础上微调学习率&#xff0c;却发现——根本记不清那次实验用的是哪个…

作者头像 李华
网站建设 2026/10/15 15:06:00

快速理解工控电路中铺铜与信号完整性的关系

铺铜不是“补地”那么简单&#xff1a;工控电路中信号完整性的隐形守护者在工业现场&#xff0c;一台PLC可能要连续运行十年以上&#xff0c;面对电机启停、继电器切换、变频器干扰等复杂电磁环境。你有没有遇到过这样的问题&#xff1a;CAN总线通信莫名其妙丢包&#xff1f;AD…

作者头像 李华
网站建设 2026/10/15 15:05:17

YOLOv8 Helm Chart制作尝试:云原生部署

YOLOv8 Helm Chart制作尝试&#xff1a;云原生部署 在智能视觉应用快速落地的今天&#xff0c;如何将一个训练好的目标检测模型高效、稳定地部署到生产环境&#xff0c;已经成为AI工程化链条中最关键的一环。传统方式下&#xff0c;开发者常常面临“在我机器上能跑”的窘境——…

作者头像 李华
网站建设 2026/10/15 15:05:17

提高es数据库写入与检索平衡性的方法解析

如何让 Elasticsearch 在高并发下“写得快”又“查得稳”&#xff1f;在现代数据密集型应用中&#xff0c;Elasticsearch&#xff08;常被简称为 es 数据库&#xff09;早已不是单纯的“搜索引擎”&#xff0c;而是支撑日志分析、监控告警、实时推荐等关键业务的底层基础设施。…

作者头像 李华