Выберите результаты, которые будут только между сегодняшним днем ​​и 2 днями в будущем.

Я так смущен работой с датами. Как я могу написать этот запрос, чтобы он только выбирал результаты, которые находятся между сегодняшним днем ​​и 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>"; } } ?>