MySQL记录在固定日期范围之间

时间:2017-11-14 00:56:10

标签: mysql codeigniter date datetime codeigniter-3

我有一个使用CodeIgniter 3构建的小应用程序,需要执行一个将转换为Chart.js的报告。该报告应每年一次,但每个月的具体日期。要求是所有数据计数必须从第4个月到第3个月。像这样:

例如1月报告将于1月4日至2月3日,2月4日至3月3日,等等。

我已经创建了一个MySQL查询,但我仍然坚持如何让日期过时。我的查询如下:

SELECT DATE_FORMAT(odd_date_created, '%Y') as 'year',
DATE_FORMAT(odd_date_created, '%m') as 'month',
COUNT(odd_id) as 'total', status
FROM odd_data 
WHERE status = $id and 
GROUP BY DATE_FORMAT(odd_date_created, '%Y%m'), status

我是MySQl的新手。有人可以帮我这个吗?我被困在哪里,我应该把日期查询。

2 个答案:

答案 0 :(得分:1)

根据规范,我想我会试图欺骗它...从该日期减去3天。这样做,1月4日回升到1月1日,2月3日回升到1月31日......所以这些都结束了1月。

  SELECT DATE_FORMAT(odd_date_created + INTERVAL -3 DAY, '%Y') AS `year`
       , DATE_FORMAT(odd_date_created + INTERVAL -3 DAY, '%m') AS `month`
       , ...
    FROM ...

   GROUP
      BY DATE_FORMAT(odd_date_created + INTERVAL -3 DAY, '%Y')
       , DATE_FORMAT(odd_date_created + INTERVAL -3 DAY, '%m')

如果有奇怪的范围,这就会崩溃......如果它不总是第4和第3个。

答案 1 :(得分:1)

首先,我要提醒您不要在&#34;之间使用&#34;如果您加入数据时使用以下内容,请使用此方法data.date >= r.period_start_dt and data.date < r.period_end_dt

其次,我假设您的数据确实有日期或时间戳,并且会落在以下计算范围之间:

set @year :=2017;

select
       *
from (
        select 
               start_dt + INTERVAL m.n MONTH     period_start_dt
             , start_dt + INTERVAL m.n + 1 MONTH period_end_dt
        from (
               select str_to_date(concat(@year,'-01-04'),'%Y-%m-%d') start_dt ) seed
        cross join (select 0 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 union all
                    select 10 union all
                    select 11
                   ) m
     ) r
## LEFT JOIN YOUR DATA
## ON data.date >= r.period_start_dt and data.date < r.period_end_dt

示例范围:(在此演示中生成您自己:http://rextester.com/CHTKSA95303

nb dd.mm.yyyy (.de format)
+----+---------------------+---------------------+
|    |   period_start_dt   |    period_end_dt    |
+----+---------------------+---------------------+
|  1 | 04.01.2017 00:00:00 | 04.02.2017 00:00:00 |
|  2 | 04.02.2017 00:00:00 | 04.03.2017 00:00:00 |
|  3 | 04.03.2017 00:00:00 | 04.04.2017 00:00:00 |
|  4 | 04.04.2017 00:00:00 | 04.05.2017 00:00:00 |
|  5 | 04.05.2017 00:00:00 | 04.06.2017 00:00:00 |
|  6 | 04.06.2017 00:00:00 | 04.07.2017 00:00:00 |
|  7 | 04.07.2017 00:00:00 | 04.08.2017 00:00:00 |
|  8 | 04.08.2017 00:00:00 | 04.09.2017 00:00:00 |
|  9 | 04.09.2017 00:00:00 | 04.10.2017 00:00:00 |
| 10 | 04.10.2017 00:00:00 | 04.11.2017 00:00:00 |
| 11 | 04.11.2017 00:00:00 | 04.12.2017 00:00:00 |
| 12 | 04.12.2017 00:00:00 | 04.01.2018 00:00:00 |
+----+---------------------+---------------------+