Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
--set @rownumber:=0;
select
case
when @rownumber is null
then @rownumber:=1
else @rownumber:=@rownumber+1
end n,
DATE_FORMAT(
date_add('2010-01-01', interval @rownumber month),
'%Y.%m') month
from
information_schema.columns t
limit 10
* This source code was highlighted with Source Code Highlighter.
n month 1 2010.02 2 2010.03 3 2010.04 4 2010.05 5 2010.06 6 2010.07 7 2010.08 8 2010.09 9 2010.10 10 2010.11
set @rownumber:=null;
select DATE_FORMAT(t.fday,'%Y.%m') as mon,count(e.id)
from
(
select
@rownumber:=if(@rownumber is null,0,@rownumber+1) n,
date_add('2010-01-01', interval @rownumber month) fday,
date_add('2010-01-01', interval @rownumber+1 month) lday
from information_schema.columns t
limit 12
) t
left join events e
on e.`start_date`<t.lday and e.end_date>=t.fday
group by t.fday
SELECT
sum(
CASE
when t.`start_date`<'2010-02-01' and t.end_date>'2010-01-01'
then 1
else 0
end
)
AS jan,
sum(
CASE
when t.`start_date`<'2010-03-01' and t.end_date>'2010-02-01'
then 1
else 0
end
)
AS feb,
sum(
CASE
when t.`start_date`<'2010-04-01' and t.end_date>'2010-03-01'
then 1
else 0
end
)
AS mar
...
FROM test t
SELECT
sum(CASE when t.`start_date`<'2010-02-01' and t.end_date>='2010-01-01' then 1 else 0 end) AS jan,
sum(CASE when t.`start_date`<'2010-03-01' and t.end_date>='2010-02-01' then 1 else 0 end) AS feb,
sum(CASE when t.`start_date`<'2010-04-01' and t.end_date>='2010-03-01' then 1 else 0 end) AS mar,
sum(CASE when t.`start_date`<'2010-05-01' and t.end_date>='2010-04-01' then 1 else 0 end) AS apr,
sum(CASE when t.`start_date`<'2010-06-01' and t.end_date>='2010-05-01' then 1 else 0 end) AS may,
sum(CASE when t.`start_date`<'2010-07-01' and t.end_date>='2010-06-01' then 1 else 0 end) AS jun,
sum(CASE when t.`start_date`<'2010-08-01' and t.end_date>='2010-07-01' then 1 else 0 end) AS jul,
sum(CASE when t.`start_date`<'2010-09-01' and t.end_date>='2010-08-01' then 1 else 0 end) AS aug,
sum(CASE when t.`start_date`<'2010-10-01' and t.end_date>='2010-09-01' then 1 else 0 end) AS sep,
sum(CASE when t.`start_date`<'2010-11-01' and t.end_date>='2010-10-01' then 1 else 0 end) AS oct,
sum(CASE when t.`start_date`<'2010-12-01' and t.end_date>='2010-11-01' then 1 else 0 end) AS nov,
sum(CASE when t.`start_date`<'2011-01-01' and t.end_date>='2010-12-01' then 1 else 0 end) AS dec
FROM test t
* This source code was highlighted with Source Code Highlighter.
WHERE start_date < '2011-01-01' AND end_date >= '2010-01-01'
SELECT
SUM(x >> 11 & 1) AS jan
SUM(x >> 10 & 1) AS feb,
SUM(x >> 9 & 1) AS mar,
SUM(x >> 8 & 1) AS apr,
SUM(x >> 7 & 1) AS may,
SUM(x >> 6 & 1) AS jun,
SUM(x >> 5 & 1) AS jul,
SUM(x >> 4 & 1) AS aug,
SUM(x >> 3 & 1) AS sep,
SUM(x >> 2 & 1) AS oct,
SUM(x >> 1 & 1) AS nov,
SUM(x & 1) AS dec
FROM (
SELECT
IF(start_date >= '2010-01-01', 0xfff >> MONTH(start_date) - 1, 0xfff) &
IF(end_date < '2011-01-01', 0xfff << 12 - MONTH(start_date), 0xfff) AS x
FROM test
WHERE start_date < '2010-01-01' AND end_date >= '2010-01-01'
);
WHERE start_date < '2011-01-01' AND end_date >= '2010-01-01'
SELECT
COUNT(IF(201001 BETWEEN a AND b, 1, NULL)) AS jan,
COUNT(IF(201002 BETWEEN a AND b, 1, NULL)) AS feb,
COUNT(IF(201003 BETWEEN a AND b, 1, NULL)) AS mar,
COUNT(IF(201004 BETWEEN a AND b, 1, NULL)) AS apr,
COUNT(IF(201005 BETWEEN a AND b, 1, NULL)) AS may,
COUNT(IF(201006 BETWEEN a AND b, 1, NULL)) AS jun,
COUNT(IF(201007 BETWEEN a AND b, 1, NULL)) AS jul,
COUNT(IF(201008 BETWEEN a AND b, 1, NULL)) AS aug,
COUNT(IF(201009 BETWEEN a AND b, 1, NULL)) AS sep,
COUNT(IF(201010 BETWEEN a AND b, 1, NULL)) AS oct,
COUNT(IF(201011 BETWEEN a AND b, 1, NULL)) AS nov,
COUNT(IF(201012 BETWEEN a AND b, 1, NULL)) AS dec
FROM (
SELECT EXTRACT(YEAR_MONTH FROM start_date) AS a, EXTRACT(YEAR_MONTH FROM end_date) AS b
FROM test
WHERE start_date < '2011-01-01' AND end_date >= '2010-01-01'
)
Подсчет количества событий календаря в каждом месяце года