Хитрый mysql подсчитывает вхождения каждого дня в диапазоне дат - PullRequest
1 голос
/ 24 января 2012

У меня проблемы с получением записей для следующих

TABLE
id | holiday_From | holiday_To
1  | 2012-01-02   | 2012-01-03
1  | 2012-01-11   | 2012-01-16
1  | 2012-01-08   | 2012-01-22
1  | 2012-01-29   | 2012-01-30
1  | 2012-01-08   | 2012-01-11

Я пытаюсь получить данные о праздничных днях за данный месяц, т. Е.

BETWEEN "2012-01-01" AND "2012-01-31"

есть похожая запись , но я не могу настроить ее для своих нужд

RESULT
day (within range) | count() //number of ppl on holiday
DATE               | 3

например,

SAMPLE OUTPUT
2012-01-02 | 1
2012-01-03 | 1
2012-01-08 | 2
2012-01-09 | 2
2012-01-10 | 2
2012-01-11 | 3
2012-01-12 | 2
2012-01-13 | 2
2012-01-14 | 2
2012-01-15 | 2
2012-01-16 | 2
......

Другими словами, я пытаюсь узнать, сколько раз найдена запись на определенную дату. То есть сколько людей в отпуске 1-го, 2-го и 3-го и т. д.

Не каждый день в ТАБЛИЦЕ за каждый месяц

Есть идеи?

p.s. это то, что у меня уже есть (мой снимок в темноте)

SELECT h.holiday_From, h.holiday_To, COUNT( * )
FROM holiday h
JOIN holiday ho ON h.holiday_From
BETWEEN DATE( "2012-01-01" )
AND IF( DATE( "2012-01-31" ) , DATE( "2012-01-31" ) , DATE( "2012-01-01" ) )
GROUP BY h.holiday_From, h.holiday_To

Ответы [ 2 ]

4 голосов
/ 24 января 2012

Пожалуйста, не пугайтесь :))

На основе генерация дней из диапазона дат

select d.everyday, count(*) from (select @rownum:=@rownum+1, date('2012-01-01') + interval (@rownum-1) day everyday from
(select 0 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) t,
(select 0 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) t2,
(select 0 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) t3,
(SELECT @rownum:=0) r WHERE @rownum < DAY(LAST_DAY('2012-01-01'))) d, tablename tbl WHERE d.everyday>=tbl.hFrom AND d.everyday<tbl.hTo GROUP BY d.everyday

Результат:

2012-01-02  1
2012-01-08  2
2012-01-09  2
2012-01-10  2
2012-01-11  2
2012-01-12  2
2012-01-13  2
2012-01-14  2
2012-01-15  2
2012-01-16  1
2012-01-17  1
2012-01-18  1
2012-01-19  1
2012-01-20  1
2012-01-21  1
2012-01-29  1

ps: я переименовал столбцы в hFrom и hTo

pps: обновленный вариант для диапазона дат

select d.everyday, count(*) from (select @rownum:=@rownum+1, date('2012-01-01') + interval (@rownum - 1) day everyday from
(select 0 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) t,
(select 0 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) t2,
(select 0 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) t3,
(SELECT @rownum:=0) r WHERE @rownum <= DATEDIFF('2012-01-11','2012-01-01')) d, `test` tbl WHERE d.everyday BETWEEN tbl.hFrom AND tbl.hTo GROUP BY d.everyday

Обновлено - номер 2 отсутствовал во всех профсоюзах. это не должно существенно влиять на что-либо.

2 голосов
/ 24 января 2012

Вы пробовали что-то подобное?

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_last-day

Эта функция предоставит вам последний день месяца независимо от переменных, таких как month / leapyear / etc ...

Возможно, это проблема, с которой вы столкнулись.Это не совсем понятно ...

SELECT h.holiday_From, h.holiday_To, COUNT( * )
FROM holiday h
JOIN holiday ho 
    ON h.holiday_From BETWEEN DATE( "2012-01-01" ) AND LAST_DAY("2012-01-01" )
GROUP BY h.holiday_From, h.holiday_To
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...