Поиск записей от 2 раз - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь получить записи между двумя датами. В частности, между началом дня и текущим временем. Это мой запрос, но у меня он не работает. У меня есть база данных MYSQL

var query = (SELECT * FROM `jobs` WHERE `EventTime` < NOW() AND `EventTime` >= '" + dtstartofday + "'  AND `PersonSel` = '" + personassigned + "' AND `PersonID` = '" + id + "'");

dtstartofday имеет тип DateTime.

1 Ответ

0 голосов
/ 16 июня 2020

Вы используете конкатенацию строк для помещения значений запроса непосредственно в строку SQL. Не делайте этого по разным причинам, одна из которых является проблемой, которую вы здесь видите - как c# выбирает форматирование даты в виде строки в соответствии с вашими региональными предпочтениями и как MySQL выбирает синтаксический анализ строка как дата будет иметь прямое влияние на выполнение запроса. В качестве грубого примера, если ваша дата указана как «2/3/2000», что означает треть февраля, вы можете использовать mysql, что интерпретирует его как второе марта. В качестве альтернативы вы можете обнаружить, что c# представляет дату как нечто, что mysql не распознает как дату, поэтому вместо этого он преобразует дату EventTime в строку, а затем сравнивает строки, что очень маловероятно (и медленно из-за всех преобразований)

Либо настройте свой запрос так, чтобы расчет начала дня выполнялся с помощью базы данных, и параметризуйте другие элементы вашего запроса:

var query = "SELECT * FROM `jobs` WHERE `EventTime` < NOW() AND `EventTime` >= CURDATE()  AND `PersonSel` = @personSel AND `PersonID` = @personID"

Или параметризуйте дату начала правильно, а не передавать ее значение в виде строки:

var query = "SELECT * FROM `jobs` WHERE `EventTime` < NOW() AND `EventTime` >= @eventTimeFrom  AND `PersonSel` = @personSel AND `PersonID` = @personID"

Чтобы добавить значения для параметров, вы объявляете его имя, тип и значение:

var cmd = new MySqlCommand(query, connection);
cmd.Parameters.Add("@eventTime", MySqlDbType.DateTime).Value = dtstartofday; //dtstartofday is a c# datetime representing midnight today e.g DateTime.Date
cmd.Parameters.Add("@personSel", MySqlDbType.Int).Value = personassigned;
cmd.Parameters.Add("@personID", MySqlDbType.DateTime).Value = id;

var x = cmd.ExecuteReader();

Важно оцените разницу между сервером и вашим локальным компьютером, особенно если они находятся в разных зонах, но даже если их часы немного отклоняются. В какой-то момент то, что каждая машина представляет себе «сегодня», будет отличаться. Подумайте об этом внимательно.


Позже, когда вам надоест бесконечно писать такой код, вы можете установить Dapper, расширение, которое сделает это за вас. Взгляните на http://dapper-tutorial.net, чтобы увидеть, как он сократит такой код до двух строк; запрос и переменные на входе, используемые объекты на выходе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...