2012-03-29 3 views
0

Я создаю отчет на php, в котором появляются 6 html drop downs, и предложите пользователю ввести две даты, в которых они хотели бы видеть данные отчета. Так, например, в докладе идет следующим образом:Логика о датах в PHP

Смотрите данные между: [месяц] [день] [год] и [месяц] [день] [год] (где скобки означают выберите тег)

Также в этом отчете - функция, которая вычисляет процентное увеличение или уменьшение по сравнению с предыдущим днем. Так, например, если пользователь не выбирает любой диапазон дат, это просто данные на текущий день и процент рассчитывается как:

round(((($newDataPointCount - $yesterdayDataPointCount)/$yesterdayDataPointCount) * 100),2) 

Это, очевидно, очень легко вычислить только на один день, потому что я могу сказать это для запроса базы данных SQL с INTERVAL 1 DAY. Но вот мой вопрос, как бы я вычислил количество дневных интервалов, если месяцы меняются?

Все будет работать отлично, если пользователь останется в течение одного месяца, так что это будет что-то вроде [March] [20] [2012] - [March] [29] [2012], и я могу легко вычислить значение 9 , но когда это похоже на [февраль] [27] [2012] - [Март] [20] [2012], как я могу рассчитать количество дней между ними?

Чтобы уточнить любые возникающие вопросы, я использую PHP и MySQL и предпочитаю оставаться в пределах этих границ.

ответ

1

Функция DATEDIFF MySQL должен выполнить задачу

DATEDIFF

+0

Я только что проверил функцию php date-> diff. Спасибо за совет! – bswinnerton

1

Даты не являются скаляры и не должны рассматриваться как таковые. Мой совет - предоставить пользователям правильные инструменты для арифметики дат.

Многие люди предполагают Отметка времени Unix, ориентированной дате математику:

$a = '2012-02-12 14:03:50'; 
$b = '2012-05-30 00:55:03'; 
$days = (strtotime($b) - strtotime($a))/86400; 

Однако, переход на летнее время и все виды факторов может сделать этот тип математики неправильно.

Мой подход заключается обычно используют DateTime:

$a = new DateTime('2012-02-12 14:03:50'); 
$b = new DateTime('2012-05-30 00:55:03'); 
$diff = $b->diff($a); 
//$diff is now a DateInterval 

Однако, чтобы ответить на ваш реальный вопрос, я бы не вытащить данные из MySQL на основе даты MySQL математике, а я бы просто дать ему дату.

WHERE d >= '2012-02-27' AND d <= '2012-03-29'; 

Хотя на основе ваших требований, вы, возможно, потребуется изменить 27 до 26, чтобы захватить в предыдущий день и делать расчеты с ним.

Что касается изменений в значениях точек, я бы либо предварительно вычислил их и сохранил, либо просто вычислил их на PHP. Нет простого способа сказать SQL «хватайтесь за каждую запись между этими датами, и пока вы на ней, сделайте некоторую математику с предыдущей записью каждой записи».

Я надеюсь, что это было ясно, но у меня есть ощущение, что оно граничит с бессвязью, кроме ясности, поэтому, если да, сообщите мне, и я отредактирую свой ответ.

Смежные вопросы