Выбор MySQL между двумя датами не работает должным образом

Я пытаюсь создать запрос, который будет выбирать все даты между двумя датами
Это мой запрос:

$query = "SELECT DISTINCT * FROM D1,D2
    WHERE D1.DATE_ADDED BETWEEN '$date1' AND '$date2' AND D1.D1_ID = D2.D2_ID";

Проблема в том, что он ничего не возвращает, но и не выдает ошибки.

Поэтому я попытался ввести его непосредственно в phpMyAdmin следующим образом.

SELECT DISTINCT * FROM D1,D2
    WHERE D1.DATE_ADDED BETWEEN '2011-01-01' AND '2011-12-12'
        AND D1.D1_ID = D2.D2_ID`

тогда вот так

SELECT DISTINCT * FROM D1,D2
    WHERE D1.DATE_ADDED BETWEEN '2011-01-01' AND '2011-12-12'

а вот так

SELECT * FROM D1
    WHERE DATE_ADDED BETWEEN '2011-01-01' AND '2011-12-12'

и я просто получаю

MySQL вернул пустой набор результатов (т. е. ноль строк). (Запрос занял 0,0003 сек.)

Да, мои таблицы существуют, и столбцы тоже :)


person PAM    schedule 08.06.2011    source источник
comment
И у вас есть данные с DATE_ADDED между 1 января 2011 года и 12 декабря 2011 года, возможно, это не данные за 2010 год?   -  person Lazarus    schedule 08.06.2011
comment
ваш код работает отлично, не могли бы вы предоставить таблицу с датами?   -  person Nightwolf    schedule 08.06.2011
comment
Не могли бы вы показать нам схему и некоторые образцы строк из двух таблиц?   -  person Toto    schedule 08.06.2011
comment
работаю сейчас! ничего не изменилось! крайне запутанно!   -  person PAM    schedule 08.06.2011


Ответы (3)


В первых случаях отсутствие результатов может быть связано с внутренним соединением. Чтобы результат был в наборе, потребуется запись в обеих таблицах, т.е. запись из d1 не появится, если d2 также не будет иметь этот идентификатор в столбце d2_id. Чтобы решить эту проблему, если это правильно для вашей бизнес-логики, используйте left join.

Однако последний из ваших случаев (без объединения) предполагает, что причиной является отсутствие совпадающих записей в первой (левой) таблице d1.

Без полного набора данных мы не можем комментировать дальше, так как весь код, который вы используете, абсолютно корректен.

person Simon Elliston Ball    schedule 08.06.2011
comment
x BETWEEN a AND b эквивалентно (a <= x) AND (x <= b) - person ypercubeᵀᴹ; 08.06.2011
comment
@ypercube. Совершенно правильно. Мгновенная аберрация есть. Исправлено в ответе. - person Simon Elliston Ball; 08.06.2011

Если вы всегда хотите выбрать весь год, проще выбрать его следующим образом:

SELECT * FROM D1 WHERE YEAR(DATE_ADDED) = 2011;

person gnur    schedule 08.06.2011
comment
Легче, да. Быстрее, нет. Быстрее (DATE_ADDED BETWEEN '2011-01-01' AND 2011-12-31) - person ypercubeᵀᴹ; 08.06.2011
comment
См. комментарий к этому ответу для получения дополнительной информации о влиянии на производительность: заголовок stackoverflow.com/questions/6273361/ - person ; 08.06.2011

Пожалуйста, реализуйте приведенный ниже код

SELECT DISTINCT * FROM D1,D2
    WHERE D1.DATE_ADDED BETWEEN DATE_FORMAT('2011-01-01','%Y-%m-%d')
        AND DATE_FORMAT('2011-12-12','%Y-%m-%d')
        AND D1.D1_ID = D2.D2_ID`
person Jignesh    schedule 08.06.2011