В связи с появлением проблемы 6-го дня (см. предыдущий пост) вытащить период (данные за определенный промежуток вермени с шагом например в день), у которого есть дата начала и дата конца, средствами php становится невозможно, поэтому пришлось выдумывать хитрую, но 100% рабочую схему в Oracle.
Начальная ситуация: статистика, есть таблица с периодами (periods) и таблица со статистическими данными, которые расположены по датам (несколько записей за день), но не всегда за все даты есть данные или требуется отобразить период, который еще не закончился, но показать нужно от начала до конца с нулями за даты, которые еще не прошли.
select d.dt, sum(<здесь все что нужно выбрать из таблицы статистики>)
from
(
SELECT (TRUNC(( select databegin from periods where period_id= '<идентификатор периода>' ), 'DD') + ROWNUM -1) as dt
FROM all_objects WHERE ROWNUM <= ( select trunc(dataend) - trunc(databegin) from periods where period_id= '<идентификатор периода>' ) + 1
) d
left join
( <таблица или несколько статистики> ) e
on d.dt=trunc(e.date)
group by d.dt
С началом октября появилась проблема 6-го дня в php (наблюдается на php-4.4.8 win32 и 4.x на linux, на других платформах эксперименты не проводились). Ее можно назвать реинкарнацией проблемы 2000 года.
Суть проблемы заключается в косяке в php-шных функциях работы со временем, результатом которой является неверное исчисление времени для октября 2008. Сентябрь, ноябрь и декабрь (дальше не проверялось) без проблем.
Более подробно видно из примера: