Логика о датах в PHP - PullRequest
       20

Логика о датах в PHP

0 голосов
/ 29 марта 2012

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 29 марта 2012

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

Многие люди предлагают использовать математическую дату в формате unix timestamp:

$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: «эй, бери каждую запись между этими датами, и пока ты находишься на ней, сделай некоторую математику с предыдущей записью каждой записи».

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

1 голос
/ 29 марта 2012

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

DATEDIFF

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...