MySql查询两个时间点之间的日期列表

本文介绍了一种使用SQL补全缺失月份数据的方法,通过创建辅助数值序号表并结合日期函数,确保即使某些月份没有数据也能在结果集中显示。

统计数据时 , 会经常按月份或者天数来汇总数据 ; 但如果某几个月份或天数没有数据的时候 , 我们仍需返回一个空值 , 方法如下 :

1. 创建辅助数值序号表

DROP TABLE IF EXISTS `num`;
CREATE TABLE `num` (
  `i` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

------------------------------

INSERT INTO `num` VALUES ('16');
INSERT INTO `num` VALUES ('2');
INSERT INTO `num` VALUES ('3');
INSERT INTO `num` VALUES ('4');
INSERT INTO `num` VALUES ('5');
INSERT INTO `num` VALUES ('6');
INSERT INTO `num` VALUES ('7');
INSERT INTO `num` VALUES ('8');
INSERT INTO `num` VALUES ('9');
INSERT INTO `num` VALUES ('10');
INSERT INTO `num` VALUES ('11');
INSERT INTO `num` VALUES ('12');
INSERT INTO `num` VALUES ('13');
INSERT INTO `num` VALUES ('14');
INSERT INTO `num` VALUES ('15');
INSERT INTO `num` VALUES ('1');
INSERT INTO `num` VALUES ('17');
INSERT INTO `num` VALUES ('18');

2. 运行如下 SQL 语句 :

select date_format(adddate('2015-09-01', INTERVAL i MONTH),'%Y-%m') as date
from num where adddate('2015-09-01', INTERVAL i MONTH) <= date_format(curdate(),'%Y-%m-%d')
order by date;

3. 结果集如下 :

date
--------------
2015-10
2015-11
2015-12
2016-01
2016-02
2016-03
2016-04
2016-05
2016-06
2016-07
2016-08
2016-09
2016-10
2016-11
2016-12
2017-01
2017-02
2017-03

个人网站: Github , 欢迎点击给星

MySQL查询两个日期范围内的数据,可以通过 `SELECT` 语句结合 `WHERE` 子句实现。假设你的表中有一个日期时间列(例如 `created_at`),并且你想筛选出在这个列的某个日期区间内的记录,可以使用以下语法: ```sql SELECT * FROM your_table_name WHERE created_at BETWEEN 'start_date' AND 'end_date'; ``` 这里需要注意几点: - `'start_date'` 和 `'end_date'` 应该是符合 MySQL 日期格式的字符串(如 `YYYY-MM-DD HH:MM:SS`)[^2]。 - 如果日期存储的是 `DATE` 类型而不是 `DATETIME`,则不需要提供具体的时间部分。 ### 示例 假设你有一个名为 `orders` 的表,其中包含一个 `order_date` 列,你想查找 `order_date` 在 `2023-10-01` 到 `2023-10-31` 之间的订单记录: ```sql SELECT * FROM orders WHERE order_date BETWEEN '2023-10-01' AND '2023-10-31'; ``` 如果 `order_date` 是 `DATETIME` 类型,并且你想指定精确的时间点,比如从 `2023-10-01 08:00:00` 到 `2023-10-31 17:00:00`,你可以这样写: ```sql SELECT * FROM orders WHERE order_date BETWEEN '2023-10-01 08:00:00' AND '2023-10-31 17:00:00'; ``` 此外,如果你需要动态地获取最近一天数据,可以使用 `NOW()` 函数与 `DATE_SUB()` 函数来构造查询条件,例如获取过去24小时内的数据: ```sql SELECT * FROM stats WHERE STR_TO_DATE(timespan, "%W, %b %d %Y, %h:%i:%s %p") >= DATE_SUB(NOW(), INTERVAL 1 DAY); ``` 这段 SQL 使用了 `STR_TO_DATE()` 函数将非标准格式的时间字符串转换为 MySQL 可识别的日期格式,然后与当前时间减去一天进行比较[^3]。 ### 注意事项 - 确保字段类型与查询中的日期格式一致。如果字段是 `DATE` 类型,则不应包含时间部分。 - 如果启用了 `NO_ZERO_DATE` 模式或严格模式,应确保插入或查询时不会使用非法日期值,如 `'0000-00-00'`[^5]。 - 对于频繁更新的记录,考虑使用 `LOW_PRIORITY` 或 `DELAYED` 插入策略以避免阻塞读取操作[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值