2015-04-17 2 views
7

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

Если это возможно, мне нужно также сделать условие внутри запроса

$coursneededdate >= startdate AND $coursneededdate <= enddate 

Вот мой код, любая помощь будет высоко оценен.

$coursneededdate = '2020-08-27'; 
$sql = "SELECT * FROM curriculum where ".$coursneededdate." between 'startdate' and 'enddate'"; 
$result = $mysqli->query($sql); 
if ($result->num_rows > 0) { 


    while($row = $result->fetch_assoc()) { 

echo $row["curriculum_id"]; 


    } 
} 
+3

какая ошибка поживаешь? – tharif

+0

Выделите переменную так же, как она все еще является строкой, когда она переходит к БД. 'SELECT * FROM curriculum where '". $ Coursneededdate. "' Между 'startdate' и 'enddate'' Если это все еще не дает результатов, проверьте даты у вас есть классы на 5 лет вперед? – chris85

+0

ваш вопрос не очень ясен. Исправьте меня, если я ошибаюсь, «вы хотите получать данные определенной даты только в том случае, если они попадают между startdata & enddate» –

ответ

3

Возможно, проблема заключается в том, что вы не указываете переменную, которая является строкой, когда она поступает в вашу БД. Также не указывайте имена столбцов.

$coursneededdate = '2020-08-27'; 
$sql = "SELECT * FROM curriculum where '".$coursneededdate."' between startdate and enddate"; 
$result = $mysqli->query($sql); 
if ($result->num_rows > 0) { 
    while($row = $result->fetch_assoc()) { 
     echo $row["curriculum_id"]; 
    } 
} 

Проблема также может заключаться в том, что вы проверяете дату на 5 лет в будущем. У вас есть данные, которые далеко впереди?

+0

Это сработало спасибо, но мне нужно проверить все дату начала и окончания, чтобы привести все данные, находящиеся между этими датами.Теперь это приносит только одну строку? –

+0

Я не уверен в этом вопросе, он должен возвращать все записи между этими диапазонами дат. Если вы запустили его в БД, возвращается более одного? Может быть, попробуйте вынуть 'if ($ result-> num_rows> 0) {' – chris85

+0

Большое спасибо, что это сработало. Я поставил дату, которая находится только между одной стартовой и конечной датой. Могу ли я сделать это с условием типа $ coursneededdate> = startdate AND $ coursneededdate <= enddate –

0

Прежде всего вам необходимо устранить проблему SQL и убедиться, что вы «закодированы» равны ожидаемому в SQL.

Я бы предложил echo $sql; посмотреть, соответствует ли запрос mysql, а затем запустить его в самой базе данных.

Если это сработает, то я хотел бы предложить, чтобы сделать то, что Chris85 указано, чтобы обернуть свои ценности и внутри одной цитаты $sql = "SELECT * FROM curriculum where '".$coursneededdate."' between 'startdate' and 'enddate'";

+0

Могу ли я поставить условие в запрос, например $ coursneededdate> = startdate AND $ coursneededdate <= enddate –

+1

, что между вами и для вас. но да. не забудьте одинаковую цитату, а также имя столбца на первом месте, а не переменную. @HussainAlmalki – azngunit81

6

Ваш SQL оператор вычисляет SELECT * FROM curriculum where '2020-08-27' between 'startdate' and 'enddate', который содержит все строковые значения и ни даты.

Параметр поставляется в виде строки, поэтому вам нужно будет преобразовать это значение в значение даты, используя STR_TO_DATE. Имена столбцов из таблицы не должны быть в кавычках. Вы когда-нибудь увидите обратную цитату, используемую для указания имен столбцов.

Ваш запрос должен быть чем-то вроде

SELECT * FROM curriculum WHERE STR_TO_DATE('2020-08-27','%Y-%m-%d') BETWEEN `startdate` AND `enddate`; 

ВАЖЕН

Если подаваемые значения даты строки приходит от пользовательского ввода, создание SQL-запрос с конкатенацией делает код уязвимый для SQL Injection ,

+1

Хороший ответ, но не нужен для 'STR_TO_DATE', если формат является стандартным форматом даты mysql, который, по-видимому, есть. Еще получить 1 вверх :) –

+0

Спасибо, сэр, могу ли я выполнить это условие в запросе $ coursneededdate> = startdate AND $ coursneededdate <= enddate –

+1

@HussainAlmalki да, вы можете, но это то, что оператор BETWEEN уже делает для вас https://dev.mysql.com/doc/refman/5.0/ru/comparison-operators.html#operator_between –

0

попробовать это

$sql = "SELECT * FROM curriculum where date = '" . $coursneededdate . "' AND date between '".$startdate."' and '" . $enddate . "'";