5

我如何显示整个一个月的所有日期,其中月份是查询参数(例如 1 到 3 之间的月份)然后输出此查询将显示从 1 月的第一个日期到 3 月的最后一个日期的日期。也许预览如下。

2013-01-01
2013-01-02
2013-01-03
..
..
2013-02-28
..
2013-03-31

对此有任何想法吗?感谢您的帮助

4

7 回答 7

4

如果您已经有一个表的条目数大于您需要的日期数,那么您可以使用这个:

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;
于 2015-02-11T17:36:03.973 回答
2

例如,对于 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)
于 2020-01-10T13:23:35.887 回答
1

如果您需要生成两个日期之间所有日期的列表,您可以借助计数(数字)表来完成。您可以轻松地创建一个这样的

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演示

于 2013-10-23T09:09:42.167 回答
1

由于 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`
于 2021-01-21T01:18:22.773 回答
0
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
于 2013-10-23T08:55:49.130 回答
0
SELECT Field1, Field2 FROM table WHERE dateField between '2013-01-01' and '2013-03-31'
于 2013-10-23T08:59:05.660 回答
0

我已经调整了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
于 2020-11-03T19:59:42.690 回答