Я так смущен работой с датами. Как я могу написать этот запрос, чтобы он только выбирал результаты, которые находятся между сегодняшним днем и 2 днями в будущем?
Дата хранится в столбце с именем EstimatedTime (с типом «текст» …), например, 201502181150
<?php $stmt = $db->query('SELECT * FROM data WHERE Status = "D" ORDER BY id DESC'); /* $Date = 201502181150; $time_ahead = date('M d', strtotime($Date. ' + 2 days')); // The above returns Feb 20, but how can I do this on MySQL? */ while($row = $stmt->fetch()) { echo "<tr>"; echo '<td>' . date('M d', strtotime($row['EstimatedTime'])) . '</td>'; echo "</tr>"; } ?>
Любая помощь будет оценена! Огромное спасибо.
Если столбец EstimatedTime
объявлен как Datatype DATETIME
или DATE
, то это просто:
WHERE t.EstimatedTime >= DATE(NOW()) AND t.EstimatedTime < DATE(NOW()) + INTERVAL 2 DAY
NOW()
возвращает текущую дату и время, функция DATE()
отключает временную часть, делая ее эквивалентной полуночи.
Если столбец объявлен как тип символа, а не DATETIME
(но почему в зеленой земле Бога вы это сделаете?), Преобразуйте выражение DATETIME
в символ в соответствующем каноническом формате, так что сравнение строк будет работать соответствующим образом:
WHERE t.EstimatedTime >= DATE_FORMAT(DATE(NOW()) ,'%Y%m%d%H%i%s') AND t.EstimatedTime < DATE_FORMAT(DATE(NOW()) + INTERVAL 2 DAY,'%Y%m%d%H%i%s')
Если EstimatedTime
хранится в виде числового (целочисленного) типа данных, тогда конвертируйте строку в числовое значение, добавив нуль …
WHERE t.EstimatedTime >= DATE_FORMAT(DATE(NOW()) ,'%Y%m%d%H%i%s')+0 AND t.EstimatedTime < DATE_FORMAT(DATE(NOW()) + INTERVAL 2 DAY,'%Y%m%d%H%i%s')+0
Вы можете использовать функцию str_to_date
и добавить интервал:
select str_to_date('201502181150', '%Y %m %d');
поэтому ваш запрос будет выглядеть:
WHERE str_to_date(t.EstimatedTime, '%Y %m %d') >= date(now()) AND str_to_date(t.EstimatedTime, '%Y %m %d') < date(now()) + interval 2 day
PHP soltion: Является ли значение 201502181150
датой в миллисекундах? Если да, просто обработайте его как целое число и добавьте 1000*60*60*24*2
который составляет 2 дня. Вы можете сделать это следующим образом:
$t = (int)$row['EstimatedTime']; $query = "SELECT * FROM data WHERE EstimatedTime > $t AND EstimatedTime < ". ($t+1000*60*60*24*2) ." ORDER BY id DESC"
Но это своего рода путь, так как вам нужно выполнить 2 MySQL запросов.
Я бы попробовал что-то вроде
<?php $stmt = $db->query('SELECT * FROM data WHERE Status = "D" ORDER BY id DESC'); $currDate = time(); //$time_ahead = Current Date + 2 Days (172800 seconds = 2 days) $time_ahead = $currDate + 172800; while($row = $stmt->fetch()) { if (!strtotime($row['EstimatedTime'] < $currDate || !strtotime($row['EstimatedDate'] > $time_ahead))) { echo "<tr>"; echo '<td>' . date('M d', strtotime($row['EstimatedTime'])) . '</td>'; echo "</tr>"; } } ?>