news 2026/4/4 20:14:31

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/3/26 23:51:00

手把手教你完成工业网关JLink驱动安装方法

手把手教你搞定工业网关中的J-Link驱动安装&#xff1a;从踩坑到自动化部署在工业级嵌入式开发中&#xff0c;一个看似简单的任务——J-Link驱动安装&#xff0c;往往能卡住整个团队的进度。你有没有遇到过这样的场景&#xff1f;调试板子已经焊好&#xff0c;电源正常&#xf…

作者头像 李华
网站建设 2026/3/30 13:53:15

YOLOv8模型压缩技术实践:剪枝与量化尝试

YOLOv8模型压缩技术实践&#xff1a;剪枝与量化尝试 在边缘计算设备日益普及的今天&#xff0c;如何让高性能目标检测模型“跑”在资源受限的小型硬件上&#xff0c;已成为算法部署的核心挑战。以YOLOv8为例&#xff0c;尽管其在COCO数据集上表现出色&#xff0c;但原始模型动辄…

作者头像 李华
网站建设 2026/3/25 1:47:31

YOLOv8镜像预装PyTorch GPU版本,提升训练效率300%

YOLOv8镜像预装PyTorch GPU版本&#xff0c;提升训练效率300% 在目标检测项目中&#xff0c;你是否经历过这样的场景&#xff1a;花了整整两天时间配置环境&#xff0c;终于装好了PyTorch、CUDA和YOLOv8依赖&#xff0c;结果运行时却报错“libcudart.so not found”&#xff1f…

作者头像 李华
网站建设 2026/3/21 18:07:51

YOLOv8 EMA权重更新策略对模型收敛的影响

YOLOv8 EMA权重更新策略对模型收敛的影响 在现代目标检测系统的训练过程中&#xff0c;一个看似微小的机制——指数移动平均&#xff08;EMA&#xff09;&#xff0c;往往能在不增加显著计算开销的前提下&#xff0c;带来可观的性能提升。尤其是在YOLOv8这类追求速度与精度平衡…

作者头像 李华
网站建设 2026/3/26 18:32:11

Python OOP 设计思想 01:存在即对象

在 Python 语言中&#xff0c;“对象”&#xff08;object&#xff09;并不是面向对象编程特有的抽象概念&#xff0c;而是程序运行时的基本事实。只要一个实体存在于 Python 的运行时环境中&#xff0c;无论它是数字、字符串、函数、类还是模块&#xff0c;它都是一个对象。这…

作者头像 李华
网站建设 2026/3/29 10:54:58

Git 初始化分支设置的潜在陷阱

在日常的编程和开发工作中,Git 是不可或缺的版本控制工具。然而,有时候我们会遇到一些看似奇怪的行为,尤其是在初始化新仓库时。今天,我们来探讨一个具体的案例,说明如何配置 Git 以避免这些问题,并解释其原理。 问题描述 假设你有一个 Git 仓库位于 ~/zmk-config,它是…

作者头像 李华