Mysql между двумя столбцами даты и времени

У меня есть следующий код, и он, похоже, не дает ожидаемых результатов:

$date_from = '2012-04-27 18:19:33';
$date_to = '2012-05-29 00:59:57';

$database->connect(); 
        $ancestors = mysql_query('
            SELECT * FROM ' . $database->db_prefix . 'comments e
                WHERE e.created BETWEEN "' . $date_from . '" AND "' . $date_to . '" AND   
                    e.ancestors = "' . $comment["id"] . '" AND e.user_id != "' . $user->user_object["id"] . '" AND
                        NOT EXISTS
                        (
                            SELECT null 
                            FROM ' . $database->db_prefix . 'notifications d
                            WHERE  d.target_id = e.id
                        )
                        ORDER BY e.created DESC
        ', $database->connection_handle);
    $database->close();

Это может быть глупой ошибкой. Но мне трудно быть уверенным, когда я не уверен, что оператор select BETWEEN и используемые даты являются действительными вещами MYSQL.

Любая помощь будет здорово. Я прочесывал, и то, что я делаю, кажется правильным, поэтому путаница.

ОТРЕДАКТИРОВАНО //

У меня есть много комментариев, сделанных между датами date_from и date_to, и в таблице уведомлений (часть не существует) нет уведомлений... В общем, я должен вернуть около 25 комментариев... Вместо этого я просто возвращаю один комментарий, который дата 2012-05-29 00:23:39

ОТРЕДАКТИРОВАНО //

Это потому, что вы можете сравнивать дату только с датой... и время с временем? Как я могу адаптировать mysql для этого?

ОТРЕДАКТИРОВАНО //

Определенно, функция between работает неправильно. Я действительно не уверен, что, черт возьми, происходит не так с этим.

  1. Можете ли вы вернуть записи между двумя датами?
  2. Можете ли вы привести пример?

ОТРЕДАКТИРОВАНО // Проблема решена. Это не имело никакого отношения к запросу, поэтому можно с уверенностью сказать, что это правильный способ сделать это. Я сделал свои диапазоны дат безумным способом. Спасибо за всю вашу чертову помощь, ребята!!!!


person Jimmyt1988    schedule 29.05.2012    source источник
comment
Какой результат генерирует ваш код? И какой результат вы ожидаете? И какой формат для поля e.created в вашей базе MySQL?   -  person Konstantin Pereiaslov    schedule 29.05.2012
comment
Зачем вообще нужен CAST? Вы можете позволить PHP сделать преобразование за вас; обычно CAST следует использовать для полей, уже находящихся в базе данных :)   -  person Ja͢ck    schedule 29.05.2012
comment
Следил за постом ниже.. :)   -  person Jimmyt1988    schedule 29.05.2012


Ответы (2)


В документации MySQL указано, что вы должны использовать CAST при использовании между значениями даты или времени , поэтому ваш запрос должен быть написан следующим образом.

WHERE e.created BETWEEN CAST("' . $date_from . '" AS DATETIME) AND CAST("' . $date_to . '" AS DATETIME) ...

Это может решить вашу проблему, если вы не получаете ожидаемых результатов между ними.

person Kibbee    schedule 29.05.2012
comment
Да, проверял сам, похоже, это не имеет значения, не знаю, почему в документации указано, что CAST рекомендуется. - person Kibbee; 29.05.2012
comment
Я пробовал WHERE e.created ›= ' . $дата_от . ' И e.created ‹=' . $дата_до . 'И безрезультатно - person Jimmyt1988; 29.05.2012
comment
В таких случаях я обычно просто запускаю запрос без оператора where, а затем добавляю разные части одну за другой, чтобы обеспечить фильтрацию, как я и ожидал. Поэтому просто укажите части даты и ничего больше в операторе where, а затем добавьте другие части. Вы, вероятно, обнаружите, что одна из частей оператора where неверна для того, что вы на самом деле пытаетесь фильтровать. - person Kibbee; 29.05.2012
comment
Я почти уверен, что есть разница в производительности... без CAST это сравнение строк, но с CAST это числовое сравнение. Однако вы получите те же результаты, по крайней мере, с этим форматом даты. - person Brilliand; 29.05.2012

Я столкнулся с той же проблемой, и я думаю, вы можете применить это решение:

$from = $_GET['from'];
$to = $_GET['to'];
include("connect.php");
$link=Connection();
$query = "SELECT * FROM records WHERE date_time BETWEEN '$from' AND '$to'";
$result=mysql_query($query,$link);
$list = array();
if($result === FALSE) {
    echo "No data";
}

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

person Raphaël VO    schedule 11.06.2015