Mysql запрос между не работает

0

Я использую php и mysql. У меня есть таблица с данными, как показано ниже,

Id  Name  SDate
1   AS    12-11-2017
2   SA    11-11-2017
3   Sw    10-11-2017

и тип данных каждого столбца,

Id int
Name Varchar
SDate Varchar

Я выбираю данные между 10-11-2017 по 11-11-2017, как показано ниже,

select * from testtable where sdate between '11-11-2017' and '12-11-2017'

Результат пуст

Но когда я выбираю, как показано ниже,

 select * from testtable where sdate='11-11-2017';

Результат приближается

Я не могу изменить колонку SDate на сегодняшний день, потому что там 10 миллионов записей

Теги:

3 ответа

1

Вы можете использовать STR_TO_DATE
Например, ваш запрос может выглядеть так:
select * from testtable where STR_TO_DATE(sdate, '%d-%m-%Y') between STR_TO_DATE('11-11-2017', '%d-%m-%Y') and STR_TO_DATE('12-11-2017', '%d-%m-%Y');
Но вам нужно проверить это, я написал из памяти.

  • 0
    Почему вы конвертируете свои даты обратно в строки, прежде чем использовать их в предложении where? Просто оставьте их как даты, чтобы у движка базы данных было меньше работы.
  • 0
    хороший момент :), я исправлю это.
1

Я предоставлю ответ, сказав, что absolutley должен изменить тип данных на таблице. Этот ответ, который я собираюсь предоставить вам, будет работать, но будет ужасно неэффективным, так как каждый раз, когда вы запускаете этот запрос, он должен конвертировать каждую запись в таблицу.

Во всяком случае, в mysql есть функция str_to_date (docs). При этом вы можете преобразовать varchar в дату во время запроса, поэтому следующий запрос должен быть достаточным:

select
    *
from
    testtable
where
    str_to_date(sdate, '%d-%m-%Y') between str_to_date('11-11-2017', '%d-%m-%Y') and str_to_date('12-11-2017', '%d-%m-%Y')
0

Как указано Faytraneozter, вы никогда не должны использовать VARCHAR в качестве замены столбцов DATE. Очевидно, что Varchar рассматривается как строка, поэтому использование> =, <= или BETWEEN приведет к выполнению струнных comparaison, чего вы не хотите.

Если VARCHAR является абсолютно обязательным, вы должны использовать формат "YYYYMMDD", который, по крайней мере, даст вам некоторую свободу для сравнения значений. (в вашем случае неясно, является ли ваш формат ММ-ДД-ГГГГ или ДД-ММ-ГГГГ...)

В противном случае вам следует рассмотреть возможность создания VIEW из этой таблицы. Синтаксис будет выглядеть так:

CREATE VIEW mynewview AS
SELECT id, name, str_to_date('date', '%d-%m-%Y') AS date2 FROM mytable;

Затем, как только ваше представление будет создано, используйте его как обычно:

SELECT * FROM mynewview WHERE date2 BETWEEN '2017-11-11' AND '2017-11-12';

Ещё вопросы

Сообщество Overcoder
Наверх
Меню