Позвольте мне объяснить мою цель сначала, у меня есть приложение для бронирования автомобилей, где посетитель добавит дату начала и дату окончания своего путешествия, в базе данных есть список драйверов с наличием (available_from_date и available_to_date), который является длительностью, в течение которой они работают, есть поле для исключений_данных для некоторых конкретных дат, когда они не работают. Приложение должно найти список транспортных средств, которые доступны в течение дат поездки, введенных пользователем. например, пользователь вводит, что он хочет перейти от места A до B в течение 13-го перерыва, с 2014 года по 17 сентября 2014 года , тогда база данных должна вернуть список такси, которые доступны в течение этого периода, и не должны иметь никакой даты исключения в течение этого периода ,с использованием mysql хранимой функции с выбранным запросом
Теперь я сохранил exclude_dates в формате, разделенном запятыми, в таблице (я мог бы создать отдельную таблицу, но тогда для выполнения запроса потребуется намного больше времени) Я пытался создать функцию mysql, которая была бы вызванный внутри фактического поискового запроса и вернет true, если есть какая-то некоторая исключенная дата, присутствующая в течение продолжительности, и false, если нет.
эти запросы, которые я написал
SELECT id, exclude_dates
FROM `taxi_route`
WHERE status = 1
AND `to_city` = 'Surat'
AND `from_city` = 'Ahmedabad'
AND `trip_type` = 2
AND `available_from_date` <= '2014-09-13'
AND available_to_date >= '2014-09-17'
AND STR_TO_DATE((SELECT `split`(exclude_dates, ',', 1)),'%d-%m-%Y')
NOT BETWEEN STR_TO_DATE('13-09-2014','%d-%m-%Y')
AND STR_TO_DATE('17-09-2014','%d-%m-%Y')
Split является функцией я создал в MySQL, чтобы отделить даты, присутствующие в формате разделителями
DELIMITER $$
CREATE FUNCTION split(str VARCHAR(500), delchar VARCHAR(2), x INT)
RETURNS VARCHAR(500)
BEGIN
RETURN SUBSTR(SUBSTRING_INDEX(str, delchar, x),
LENGTH(SUBSTRING_INDEX(str, delchar, x-1))+IF(x > 1, 2, 1));
END$$
DELIMITER ;
это работает отлично, насколько я передать 1 в split (exclude_dates, ',', 1), но если у exclude_dates больше одной даты, тогда это не сработает может кто-то может предложить или указать, как это можно сделать. моментальный снимок базы данных находится здесь http://i.imgur.com/JaI8MSx.png
Остановить это -> 'STR _TO_DATE() ' – Kermit
hi @Kermit, спасибо за комментирование, но нам не нужно преобразовывать строку, заданную пользователем, в допустимый формат даты, и exclude_dates является varchar, и когда мы извлекаем дату из нее, это будет строка, которая снова необходимо преобразовать в формат даты? –
Вы не должны хранить дату в виде строки. – Kermit