MySQL显示整个一个月的所有日期

MySQL显示整个一个月的所有日期,mysql,date,Mysql,Date,如何显示整个月份的所有日期,其中月份是查询的参数,例如1到3之间的月份,然后输出此查询将显示从1月的第一个日期到3月的最后一个日期的日期。也许可以像下面这样预览 2013-01-01 2013-01-02 2013-01-03 .. .. 2013-02-28 .. 2013-03-31 你知道吗?谢谢你的帮助 select * from your_table where month(`date`) between 1 and 3 如果你在某一年需要它,你应该加上它 select * fro

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

2013-01-01
2013-01-02
2013-01-03
..
..
2013-02-28
..
2013-03-31
你知道吗?谢谢你的帮助

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
如果您需要生成两个日期之间所有日期的列表,您可以借助理货编号表来完成。您可以很容易地创建这样一个

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

这里是演示

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

SELECT adddate('2013-01-01', @rownum := @rownum + 1) dt FROM my_table
JOIN (SELECT @rownum := -1) r
LIMIT 31;
为我的桌子选择一张小桌子。如果my_表包含的条目太多,请使用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'))
我已经调整为自动列出当前月份的所有日期,没有硬编码日期:

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

由于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`

mysql中是否有任何函数,因为我想将此查询与其他表(如员工考勤报告的派生表)连接起来,其中显示一个月的所有日期。员工表派生表/查询其他\u查询| | V V V+----------------+++|员工id |日期|状态|++------++++| 1001 | 2013-01-01 | A | |+++++-++它仍然在创建表?如果我不需要创建表,比如派生表或临时数据,而不是DB上的物理数据,有什么解决方案吗?谢谢@peterm,我真的很欣赏它,但它仍然不能解决我的问题,也许除了必须创建表之外没有任何方法..谢谢@empugandring。我只是不认为需要创建表。这似乎不太合适
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
WITH RECURSIVE `days` AS
(
   SELECT 1 AS `day` UNION ALL SELECT `day` + 1 FROM `days` WHERE `day` < DAY(LAST_DAY(NOW()))
)
SELECT * FROM `days`