2013-11-26 3 views
0

У меня есть время, подобное этому 2013-08-12 12:58:14. Теперь я хочу час, поэтому я использую следующий код:получить данные между часами в php

$date = "2013-08-12 12:58:14"; 
$date = strtotime($date); 
$hour = date('H', $date); 

Так я получаю $hour=12; теперь у меня есть другой параметр $tohour=5 (он определяется пользователем, значение которого составляет от 1 до 24); теперь 12-5=7 означает выборку данных между временем 7 to 12.


Другой пример:

Пусть время 2013-08-12 01:15:23 и $tohour=10.
Теперь на этот раз данные извлекаются между 2013-08-11 15:15:23 в 2013-08-12 01:15:23.


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

+0

У вас есть таблицы в база данных с отметками времени? –

+0

да, у меня есть стол со временными метками. – DS9

ответ

2

В MySQL,

SELECT fields 
FROM table 
WHERE timefield BETWEEN DATE_SUB('$date', INTERVAL $tohour HOUR) AND '$date' 
+0

Каково ваше значение '$ todate' ?.did вы имеете в виду' $ tohour'? – DS9

+1

Er, SELECT 1 BETWEEN 3 AND 0; -> 0 – Strawberry

+0

ya true..Этот запрос работает, когда я меняю его, поэтому, пожалуйста, обновите его. – DS9

1

Вы можете легко получить от и до времени, используя StrToTime:

$baseTime = strtotime('2013-08-12 01:15:23'); 
$from = strtotime('+'.$hour.' hours',$basetime); 
$to = strtotime('+'.$tohour.' hours',$basetime); 
echo "From: ".date("Y-m-d H:i:s",$from)."\n"; 
echo "To: ".date("Y-m-d H:i:s",$to)."\n"; 

Или в MySQL:

SELECT 
    * 
FROM 
    `table` 
WHERE 
    `time` 
BETWEEN 
    DATE_ADD('$time',INTERVAL $hour HOUR) 
AND 
    DATE_ADD('$time',INTERVAL $tohour HOUR) 
+0

Я использую ваш запрос, он выглядит как 'SELECT * FROM cdr, где calldate BETWEEN DATE_ADD ('2012-08-29 23: 00: 00', INTERVAL 23 HOUR) AND DATE_ADD ('2012-08-29 23:00:00 ', INTERVAL 5 HOUR) ', но он не получил данных. – DS9

+0

в базе данных, данные находятся между '2012-08-29 21: 18: 23' to '2012-08-29 21: 49: 23. – DS9

+0

Это в основном переводит на этот запрос: SELECT * FROM cdr WHER calldate BETWEEN '2012-08-30 22:00:00' AND '2012-08-30 04:00:00 «Это то, что вы хотите? –

0

В простом PHP:

$toHour = 10; 
$dateTo = \DateTime::createFromFormat('Y-m-d H:i:s', '2013-08-12 12:58:14'); 
$dateFrom = clone $dateTo; 
$dateFrom->sub(new \DateInterval('PT'.$toHour.'H')); 
var_dump(
    'From: ' . $dateFrom->format('Y-m-d H:i:s'), 
    'To: ' . $dateTo->format('Y-m-d H:i:s') 
); 

Но лично я бы пошел с решением MySQL.

PS. Конечно, это решение для PHP 5> = 5.3.0

0

Я предпочел сделать некоторые вычисления на PHP и использовать простой запрос mysql.

$timeEnd = '2013-08-12 01:15:23'; 
$toHour = 10; 

$timeStart = date('Y-m-d H:i:s', strtotime($timeEnd) - $toHour * 3600); 

echo "Fetch data between $timeStart to $timeEnd"; 
// Result: Fetch data between 2013-08-11 15:15:23 to 2013-08-12 01:15:23 

Затем мы получили 2 строку даты, не дб запрос с ними, см:

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