我如何显示整个一个月的所有日期,其中月份是查询参数(例如 1 到 3 之间的月份)然后输出此查询将显示从 1 月的第一个日期到 3 月的最后一个日期的日期。也许预览如下。
2013-01-01
2013-01-02
2013-01-03
..
..
2013-02-28
..
2013-03-31
对此有任何想法吗?感谢您的帮助
如果您已经有一个表的条目数大于您需要的日期数,那么您可以使用这个:
SELECT adddate('2013-01-01', @rownum := @rownum + 1) dt FROM my_table
JOIN (SELECT @rownum := -1) r
LIMIT 31;
为my_table选择一个小表。如果my_table包含太多条目,请使用 limit 使其更快。
其基础是使用自动递增自身的计数器,如 rownum。使用日期函数进行过滤的更复杂的查询:
SELECT * FROM
(SELECT adddate('2013-01-01', @rownum := @rownum + 1) dt FROM my_table
JOIN (SELECT @rownum := -1) r LIMIT 1000) temp
WHERE MONTH(dt) = 1 AND YEAR(dt) = 2015;
例如,对于 2019 年 12 月:
select FROM_UNIXTIME(UNIX_TIMESTAMP(CONCAT('2019-12-',n)),'%Y-%m-%d') as Date from (
select (((b4.0 << 1 | b3.0) << 1 | b2.0) << 1 | b1.0) << 1 | b0.0 as n
from (select 0 union all select 1) as b0,
(select 0 union all select 1) as b1,
(select 0 union all select 1) as b2,
(select 0 union all select 1) as b3,
(select 0 union all select 1) as b4 ) t
where n > 0 and n <= day(last_day('2019-12-01'))
它产生以下结果:
+------------+
| Date |
+------------+
| 2019-12-01 |
| 2019-12-02 |
| 2019-12-03 |
| 2019-12-04 |
| 2019-12-05 |
| 2019-12-06 |
| 2019-12-07 |
| 2019-12-08 |
| 2019-12-09 |
| 2019-12-10 |
| 2019-12-11 |
| 2019-12-12 |
| 2019-12-13 |
| 2019-12-14 |
| 2019-12-15 |
| 2019-12-16 |
| 2019-12-17 |
| 2019-12-18 |
| 2019-12-19 |
| 2019-12-20 |
| 2019-12-21 |
| 2019-12-22 |
| 2019-12-23 |
| 2019-12-24 |
| 2019-12-25 |
| 2019-12-26 |
| 2019-12-27 |
| 2019-12-28 |
| 2019-12-29 |
| 2019-12-30 |
| 2019-12-31 |
+------------+
31 rows in set (0.00 sec)
如果您需要生成两个日期之间所有日期的列表,您可以借助计数(数字)表来完成。您可以轻松地创建一个这样的
CREATE TABLE tally (n int not null primary key);
INSERT INTO tally
SELECT a.N + b.N * 10 + c.N * 100 + 1 n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) c
ORDER BY n;
现在要创建 1 月 1 日和 3 月最后一天之间所有日期的列表,您可以执行此操作
SELECT '2013-01-01' + INTERVAL t.n - 1 DAY day
FROM tally t
WHERE t.n <= DATEDIFF(LAST_DAY('2013-03-01'), '2013-01-01') + 1
这是SQLFiddle演示
由于 MySQL 8.0(或 MariaDB 10.2.2)可以使用递归公用表表达式:
WITH RECURSIVE `days` AS
(
SELECT 1 AS `day` UNION ALL SELECT `day` + 1 FROM `days` WHERE `day` < DAY(LAST_DAY(NOW()))
)
SELECT * FROM `days`
select * from your_table
where month(`date`) between 1 and 3
如果您在特定年份需要它,您应该添加
select * from your_table
where year(`date`) = 2013
and month(`date`) between 1 and 3
SELECT Field1, Field2 FROM table WHERE dateField between '2013-01-01' and '2013-03-31'
我已经调整了Brent Frere 的答案以自动列出当月的所有日期,而没有对日期进行硬编码:
select FROM_UNIXTIME(UNIX_TIMESTAMP(CONCAT(year(now()),'-',month(now()),'-',n)),'%Y-%m-%d') as Date from (
select (((b4.0 << 1 | b3.0) << 1 | b2.0) << 1 | b1.0) << 1 | b0.0 as n
from (select 0 union all select 1) as b0,
(select 0 union all select 1) as b1,
(select 0 union all select 1) as b2,
(select 0 union all select 1) as b3,
(select 0 union all select 1) as b4 ) t
where n > 0 and n <= day(last_day(now()))
order by Date
或者,如果您想使用 MySQL 变量设置年份和月份:
set @year = 2020, @month = 11;
select FROM_UNIXTIME(UNIX_TIMESTAMP(CONCAT(@year,'-',@month,'-',n)),'%Y-%m-%d') as Date from (
select (((b4.0 << 1 | b3.0) << 1 | b2.0) << 1 | b1.0) << 1 | b0.0 as n
from (select 0 union all select 1) as b0,
(select 0 union all select 1) as b1,
(select 0 union all select 1) as b2,
(select 0 union all select 1) as b3,
(select 0 union all select 1) as b4 ) t
where n > 0 and n <= day(last_day(CONCAT(@year,'-',@month,'-',1)))
order by Date