Не запутайтесь в типе данных - это не имеет никакого отношения к вашей проблеме. Вы увидите это, если убрать / в датах - чтобы получить реальные цифры: 20.02.2013 на самом деле более чем на 21 миллион больше, чем 01.02.2014
20/02/2013 = 20022013
01/02/2014 = 1022014
Если ваш varchar имеет числа в порядке даты, месяца, года - вы должны переупорядочить их в поле или в запросе, чтобы получить правильные значения, но если они находятся в году, месяце, дне, у вас есть varchar, который будет сортировать только как свидание.
РЕШЕНИЕ 1. Если вы должны оставить все как есть в таблице, вы должны сделать следующее:
Таблица базы данных:
CREATE TABLE `dates` (
`date_varchar` varchar(15) DEFAULT NULL,
`date_datetime` datetime DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
Данные:
date_varchar date_datetime
01/02/2013 2013-02-01 00:00:00
02/02/2013 2013-02-02 00:00:00
03/02/2013 2013-02-03 00:00:00
03/02/2014 2014-02-03 00:00:00
03/03/2013 2013-03-03 00:00:00
04/02/2013 2013-02-04 00:00:00
05/02/2013 2013-02-05 00:00:00
Запрос:
SELECT *
FROM dates
WHERE STR_TO_DATE(date_varchar,'%d/%m/%Y')
BETWEEN '2013-02-03' AND '2013-02-04'
Вернет две записи:
date_varchar date_datetime
03/02/2013 2013-02-03 00:00:00
04/02/2013 2013-02-04 00:00:00
РЕШЕНИЕ 2:
Чтобы изменить порядок в varchar на год, месяц, дату в поле. См. данные таблицы ниже:
date_varchar date_datetime
2013/02/01 2013-02-01 00:00:00
2013/02/02 2013-02-02 00:00:00
2013/02/03 2013-02-03 00:00:00
2013/02/04 2013-02-04 00:00:00
2013/02/05 2013-02-05 00:00:00
2013/03/03 2013-03-03 00:00:00
2014/02/03 2014-02-03 00:00:00
Теперь вы можете выбрать:
SELECT *
FROM dates
WHERE date_varchar
BETWEEN '2013/02/02' AND '2013/02/03'
Теперь числа упорядочены так же, как и datetime — вы можете просто убрать / и — чтобы увидеть числа. Таким образом, varchars сортируются так же, как date_time.
Запрос возвращает те же две строки:
date_varchar date_datetime
2013/02/02 2013-02-02 00:00:00
2013/02/03 2013-02-03 00:00:00
РЕШЕНИЕ 3.
Это не для вас, потому что вы не хотите менять таблицу, но я включаю ее для полноты картины. Изменив тип данных на дату и время, вы вынуждены расположить числа в правильном порядке, и вы используете этот запрос, чтобы получить диапазон между датами:
SELECT *
FROM dates
WHERE date_datetime
BETWEEN '2013-02-03' AND '2013-02-04'
Те же две записи:
date_varchar date_datetime
03/02/2013 2013-02-03 00:00:00
04/02/2013 2013-02-04 00:00:00
ПРИМЕР ПРОБЛЕМЫ:
Теперь просто выбирая даты, когда varchar возвращает - как вы уже догадались - те же две записи, что и первый запрос и еще несколько, точно так же, как то, что происходит с вами:
Данные:
date_varchar date_datetime
01/02/2013 2013-02-01 00:00:00
02/02/2013 2013-02-02 00:00:00
03/02/2013 2013-02-03 00:00:00
03/02/2014 2014-02-03 00:00:00
03/03/2013 2013-03-03 00:00:00
04/02/2013 2013-02-04 00:00:00
05/02/2013 2013-02-05 00:00:00
SELECT *
FROM dates
WHERE date_varchar
BETWEEN '03/02/2013' AND '04/02/2013'
date_varchar date_datetime
03/02/2013 2013-02-05 00:00:00
03/02/2014 2014-02-03 00:00:00
03/03/2013 2013-02-05 00:00:00
04/02/2013 2013-02-03 00:00:00
person
Bingo
schedule
08.02.2013