Ankit Johri Ответов: 1

Как проверить текущую выбранную дату лежит ли она между датами хранящимися в таблице базы данных


Я работаю над системой управления отпусками. Предположим, Empid=00001, и он взял отпуск на 8 дней с 30-05-2019 по 06-06-2019 и эти данные сохранил в таблице базы данных. Теперь снова, если тот же Empid=0001, попробуйте подать заявление на отпуск между 30-05-2019 и 06-06-2019 снова, предположим, что он пытается подать заявление на однодневный отпуск с 03-06-2019 по 03-06-2019, который лежит между вышеуказанной датой. Поэтому он должен сначала проверить, что для этой записи сотрудника есть отпуск с 30-05-2019 по 06-06-2019 уже в базе данных. Поэтому он не должен позволять сотруднику подавать заявление на какой-либо другой отпуск на эту дату.

LeavefromDate -- столбец таблицы
StartDate - переменная, содержащая текущую дату начала отпуска.
EndDate-переменная, содержащая текущую дату окончания отпуска.

Моя база данных находится в sqlite3.

Ищете идеальный запрос SQLite для работы

Что я уже пробовал:

Выберите * из empleave, где Empcode ='" + txtLeaveempcode.Текст + " и IsUploaded='0' и (дата(функцию substr(LeavefromDate, 7, 4) || '-' || функцию substr(LeavefromDate, 4, 2) || '-' || функцию substr(LeavefromDate, 1, 2) ) между" + начальная дата + "" и "" + дата окончания + "') или (дата(функцию substr(LeavefromDate, 7, 4) || '-' || функцию substr(LeavefromDate, 4, 2) || '-' || функцию substr(LeavefromDate, 1, 2) ) между" + начальная дата + "" и "" + дата окончания + "');

1 Ответов

Рейтинг:
8

OriginalGriff

Только не это! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

А еще есть ваш дизайн БД ... ах милый. Часть того, почему ваш запрос настолько уродлив и труден для разработки, заключается в том, что вы храните все в виде строк. Это плохо - очень плохо - и вам нужно исправить это во всем вашем приложении. Всегда храните данные в соответствующих форматах: числа идут в INT, десятичные или плавающие столбцы, даты идут в DATE, DATETIME или DATETIME2, например. Если вы этого не сделаете, то ваша работа будет намного сложнее, как вы уже видели с этой задачей.

Когда вы исправили это через все свое приложение, вы можете начать смотреть, как исправить проблему, которую вы заметили, - но нет никакого смысла пытаться, пока вы этого не сделали!