2016-03-03 2 views
1

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

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

$today_raw = date('Y-m-d'); 
$yearAgo = date('Y-m-d', strtotime('-1 year', strtotime($today_raw))); 
$weekAgo = date('Y-m-d', strtotime('-6 day', strtotime($today_raw))); 
$weekYearAgo = date('Y-m-d', strtotime('-1 year', strtotime($weekAgo))); 

$stmt_currentWeek = $pdo->prepare("SELECT X FROM Y WHERE Z BETWEEN '$weekAgo' AND '$today'"); 
$stmt_weekLastYear = $pdo->prepare("SELECT X FROM Y WHERE Z BETWEEN '$weekYearAgo' AND '$yearAgo'"); 

Очевидно, что SELECT возвращает неверное число значений, $weekYearAgo просто неправильна, поскольку он не отражает различия високосного года.

Что я делаю неправильно?

+3

Почему вы не используете объект dateTime, который находится внутри PHP? он должен решить вашу проблему. – RFLdev

+2

Являются ли временные метки в вашей базе данных того же часового пояса, что и дата установки в вашем 'php.ini'? Если нет, вам необходимо согласовать дату php перед отправкой в ​​базу данных. – Daniel

+1

Почему вы не используете встроенные функции даты SQL? Им нужно иметь дело с этим. Что-то вроде 'NOW() - INTERVAL 1 YEAR' – apokryfos

ответ

2

Просто используйте MySQL функции ДАТА:

$stmt_currentWeek = $pdo->prepare("SELECT X FROM Y WHERE Z >= DATE_SUB(NOW(), INTERVAL 1 WEEK)"); 
$stmt_weekLastYear = $pdo->prepare("SELECT X FROM Y WHERE Z BETWEEN DATE_SUB(DATE_SUB(NOW(), INTERVAL 1 YEAR), INTERVAL 1 WEEK) AND DATE_SUB(NOW(), INTERVAL 1 YEAR)"); 

1 год и 1 неделю назад:

DATE_SUB(DATE_SUB(NOW(), INTERVAL 1 YEAR), INTERVAL 1 WEEK) 

1 год назад:

DATE_SUB(NOW(), INTERVAL 1 YEAR) 

1 неделю назад:

DATE_SUB(NOW(), INTERVAL 1 WEEK) 

В первом SQL вам не нужно Между 1 WEEK AGO и NOW вы можете просто переписать его на> = 1 WEEK AGO

+0

@AntonSack Добро пожаловать! – Kordi

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