繁体   English   中英

MySQL - 如何显示特定月份的所有天数记录?

[英]MySQL - How to show all days records in particular month?

select a.Date 
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
    from (select 0 as a 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) as a
    cross join (select 0 as a 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) as b
    cross join (select 0 as a 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) as c
) a 
where a.Date between '2015-04-15' and '2015-05-15' ORDER BY Date

以上查询工作正常,我从选定日期到选定日期获得 30 条记录。 但我想显示完整的月份记录。 如果我选择February那么所有 28 天(闰年为 29 天)的记录都会显示。 Mar相同 = 31条记录April = 30条记录。 等等。

编辑:见截图。 我想显示一个月中的所有天数。

在此处输入图片说明

如果可能的话,请发布您的答案。

如果您知道您输入的年份和月份,那么您总是可以设置第一天,假设输入是Y = 2012 M=02 ,第一天将始终是2012-02-01并且使用该日期您可以获得最后一天和然后是该范围内的日期。 某事如

select a.Date 
from (
    select last_day('2012-02-01') - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
    from (select 0 as a 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) as a
    cross join (select 0 as a 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) as b
    cross join (select 0 as a 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) as c
) a 
where a.Date between '2012-02-01' and last_day('2012-02-01') order by a.Date;

+------------+
| Date       |
+------------+
| 2012-02-01 |
| 2012-02-02 |
| 2012-02-03 |
| 2012-02-04 |
| 2012-02-05 |
| 2012-02-06 |
| 2012-02-07 |
| 2012-02-08 |
| 2012-02-09 |
| 2012-02-10 |
| 2012-02-11 |
| 2012-02-12 |
| 2012-02-13 |
| 2012-02-14 |
| 2012-02-15 |
| 2012-02-16 |
| 2012-02-17 |
| 2012-02-18 |
| 2012-02-19 |
| 2012-02-20 |
| 2012-02-21 |
| 2012-02-22 |
| 2012-02-23 |
| 2012-02-24 |
| 2012-02-25 |
| 2012-02-26 |
| 2012-02-27 |
| 2012-02-28 |
| 2012-02-29 |
+------------+
29 rows in set (0.00 sec)

刚刚在寻找 OP 中列出的问题的答案时遇到了这篇文章,Abhik Chakraborty 的答案非常有效。

如果您想从表中选择数据并希望列出一个月中的每一天,无论您的表中是否有该月特定日期的数据,我想我会发布一个如何使用答案的示例。

基本上你需要做的是使用上面的答案来创建一个派生表,你可以将现有表LEFT JOIN到这样,一个月中的每一天都会被列出,你可以显示表中存在的日期的数据. 此查询已准备好复制/粘贴,您需要做的就是yourTable的引用更改为yourTable中获取数据的表名。

这是示例查询:

SELECT `dateList`.`Date`,
    CASE WHEN `yt`.`date` IS NULL THEN 0
    ELSE COUNT(`yt`.`id`) 
    END AS `amt`
FROM

-- this is the part you can copy/paste 
-- to be used to left join in a table of your choice 
-- ---------------------------------------------------------------------------------------------------------------------------
(
    SELECT `a`.`Date`
    FROM (
        SELECT LAST_DAY('2020-02-01') - INTERVAL (`a`.`a` + (10 * `b`.`a`) + (100 * `c`.`a`)) DAY AS `Date`
        FROM (SELECT 0 AS `a` 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) AS `a`
        CROSS JOIN (SELECT 0 AS `a` 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) AS `b`
        CROSS JOIN (SELECT 0 AS `a` 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) AS `c`
    ) AS `a` 
    WHERE `a`.`Date` between '2020-02-01' and LAST_DAY('2020-02-01')
) AS `dateList` 
-- ---------------------------------------------------------------------------------------------------------------------------

LEFT JOIN `yourTable` AS `yt` ON `dateList`.`Date` = DATE(`yt`.`date`)
GROUP BY `dateList`.`Date`
ORDER BY `dateList`.`Date` ASC

这是sql fiddle中的示例。

希望这有帮助,它确实帮助了我。

下面是两个查询的示例,可用于获取您需要的所有记录。 第一个查询将为您提供当前日期前 5 个月的记录,第二个查询将为您提供当月第一天的记录。

这些只是示例,因此您可以调整这些查询以显示您需要的相关信息。

时间戳/日期,这可以是日期或时间戳,具体取决于您选择将日期存储到数据库中的格式

当前日期前 5 个月的示例

select * from table where timestamp/date >= now() - interval 5 month;

示例 每月第一天之前的 5 个月

select * from table where timestamp/date >= last_day(now()) + interval 1 day - interval 5 month;

使用用户定义的变量更加干净和简单:

    select a.Date
from (
    select last_day(@firstDay) - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
    from (select 0 as a 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) as a
    cross join (select 0 as a 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) as b
    cross join (select 0 as a 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) as c
    cross join (select @firstDay:='2012-02-01') var
) a
where a.Date between @firstDay and last_day(@firstDay) order by a.Date;

如果你想要两个日期之间的严格范围,只需添加@lastDay:

select a.Date
from (
    select @lastDay - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
    from (select 0 as a 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) as a
    cross join (select 0 as a 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) as b
    cross join (select 0 as a 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) as c
    cross join (select @firstDay:='2012-02-04',@lastDay:='2012-08-15') var
) a
where a.Date between @firstDay and @lastDay order by a.Date;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM