我有一个使用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的新手。有人可以帮我这个吗?我被困在哪里,我应该把日期查询。
答案 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 |
+----+---------------------+---------------------+