В моем проекте я создаю и сохраняю счет (счет-фактуру). Дата сохранения Билла поступает в текстовое поле из javascript date picker (маленький всплывающий календар) перед сохранением. Формат даты: DD-MON-YYYY (18-Jun-2013).
Я использую тип данных « Текст » для хранения дат в таблице MySql.
Я сделал выбор записей (Предыдущие счета) из таблицы с помощью одной даты. , ,
$ result = mysql_query ("SELECT * FROM out WHERE date = '". $ date. "' ORDER BY billNo");
Теперь, что я хочу сделать: выбрать записи (счета) между двумя датами …..
Мой точный вопрос: возможно ли запросить базу данных mysql с этими настройками или мне нужно внести некоторые изменения, чтобы эффективно выбирать записи между двумя датами? Как я могу достичь этого?
Ps – Эффективно ли использовать
1. «SELECT * FROM out WHERE date МЕЖДУ». $ from_date. "' А ТАКЖЕ '" . $ to_date. «ORDER by id DESC»
Или
2. SELECT * FROM out WHERE date> "15-Jun-2013" и дата <"18-JUN-2013"
Вы должны использовать функцию strtotime
PHP для преобразования строковой даты в формат временной strtotime
UNIX и изменить тип данных MySQL для поля даты в TIMESTAMP
.
Чем вы можете делать эффективные запросы с помощью >
и <
.
Вы можете сделать это по-разному, но вам нужно будет выполнить полное сканирование таблицы для каждого запроса.
select the_dates, STR_TO_DATE(the_dates, '%d-%M-%Y') as converted from testing where STR_TO_DATE(the_dates, '%d-%M-%Y') between '2013-06-20' and '2013-06-23'
Ссылка на SQLFiddle
Если это столбец DATE
, вы можете получить все даты между 15 июня 2013 года и 18 июня 2013 года (включительно), используя это:
WHERE date BETWEEN '2013-06-15' AND '2013-06-18'
Если это столбец DATETIME
, сделайте это вместо этого:
WHERE date >= '2013-06-15' AND date < '2013-06-19'
Если индексный столбец date
индексируется, этот подход позволит убедиться, что индексы доступны для оптимизации. Если он не проиндексирован, подход будет таким же быстрым, как и многие другие способы, которыми вы можете это сделать.
Приложение : просто увидели «сохранение как текст» среди всех других кричащих сведений. Обратите внимание, что этот ответ применяется только в том случае, если тип DATE
или DATETIME
. Я оставлю это, потому что лучшим ответом является изменение типа данных столбца, а затем использование этого или одного из других предлагаемых вариантов.
Я использую тип данных «Текст» для хранения дат в таблице MySql.
Это проблема. Вы должны хранить даты в datetime
date
или datetime
в MySQL. Если вы не заботитесь о временной части, date
должно быть достаточно.
Если вы измените свой тип данных на дату, выполните следующие действия:
select x,y,z from table a where a.datecolumn between @startdate and @enddate
Должен работать нормально.
Если вы используете текстовый тип данных, вам нужно будет указать столбец в столбец даты, а затем применить диапазон выбора даты, который будет медленнее из-за броска.
Всегда сохраняйте данные в типе данных, который соответствует его типу. Если дата, то столбец даты, если это текст, текст или varchar и т. Д. Уровень представления вашего приложения может беспокоиться о формате, в котором эти данные представлены пользователю.
Вы сказали, что используете столбцы TEXT
для хранения дат. Это очень плохая идея. Если вы переключитесь на DATE
или DATETIME
, это станет тривиальным.
Поскольку вы храните его в виде текста, но вы хотите, чтобы SQL анализировал его, поскольку DATE SQL не понимает в первую очередь.
В вашем примере SQL будет использовать правила сравнения TEXT. Итак, 15 апреля <15-Мар> 15-DEC
Если вы храните даты в базе данных SQL, вы должны хранить ее как дату, а не как ТЕКСТ.