#c# #mysql #sql
#c# #mysql #sql
Вопрос:
Я хотел бы отправить запрос MySQL, в котором я выбираю дату из своего выпадающего списка программирования на C #, например, 06.04.2014. Тогда результат должен показать -2 дня, включая само 04/06/2014. т.Е. Результат в конечном итоге покажет данные с 02/06/2014 по 06/06/2014 (всего 5 дней) в моем DataGridView. Моя команда MySQL ниже показывает только данные за 06.04.2014, может кто-нибудь любезно исправить мой код? Любая помощь будет высоко оценена!
Примечание: предполагается 04/06/2014
, что он будет заменен моим кодом на C # comboBox_stockDates.SelectedItem.ToString()
SELECT Prices_Date, Prices_Time, Prices_Open
FROM tableprices
WHERE Ticker_ID = 732
AND DATE_ADD(STR_TO_DATE('04/06/2014', '%d/%m/%Y'), INTERVAL - 2 DAY)
AND DATE_ADD(STR_TO_DATE('04/06/2014', '%d/%m/%Y'), INTERVAL - 1 DAY)
AND Prices_Date = STR_TO_DATE('04/06/2014', '%d/%m/%Y')
AND DATE_ADD(STR_TO_DATE('04/06/2014', '%d/%m/%Y'), INTERVAL 1 DAY)
AND DATE_ADD(STR_TO_DATE('04/06/2014', '%d/%m/%Y'), INTERVAL 2 DAY)
ORDER BY Prices_Date ASC, Prices_Time ASC;
Ответ №1:
Вы SELECT
фильтруете только столбец Price_Date и текущую дату. Это должно сработать для вас:
SELECT Prices_Date,
Prices_Time,
Prices_Open
FROM tableprices
WHERE Ticker_ID = 732
AND Prices_Date >= DATE_ADD (STR_TO_DATE ('04/06/2014', '%d/%m/%Y'), INTERVAL -2 DAY)
AND Prices_Date <= DATE_ADD (STR_TO_DATE ('04/06/2014', '%d/%m/%Y'), INTERVAL 2 DAY)
ORDER BY Prices_Date ASC, Prices_Time ASC;
Для эффективного использования индексов вашей таблицы (если таковые имеются) лучше преобразовать даты перед запросом, как предложил Крис.
Комментарии:
1. Привет @sreuter, в 6-й строке написано
syntax error, unexpected ')', expecting ' '
, есть идеи? 🙂2. Запрос кажется правильным. Есть ли какие-либо скобки из вашего кода, которые входят в запрос?
3. О, может быть, вы могли бы попытаться удалить пробелы перед открывающей скобкой. Я думаю, что некоторым серверам они не нравятся 😉
4. Я помещаю этот код непосредственно в MySQL Workbench (не просматривая свой код), и при его выполнении появляется синтаксическая ошибка. Хорошо, я удалил пробел после
DATE_ADD
, и это работает, спасибо! 🙂 Но мой набор данных очень огромен, для возврата результата потребовалось очень много времени. Возможно, мне придется изучить другой ответ..5. Да, как я уже писал, вы не используете правильные индексы при вычислении по индексированным столбцам. Если нет индексов, установите один в Prices_Date и вычислите даты от / до запроса.
Ответ №2:
По какой-либо причине вы не можете выполнить преобразование в C #? Кажется более чистым.
Тогда это будет таблица выбора из таблицы, где дата больше или равна, а дата меньше или равна.
C # Код:
var dt = DateTime.ParseExact(comboBox_stockDates.SelectedItem.ToString(), "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);
var start = dt.AddDays(-2);
var end = dt.AddDays(2);
Затем выберите:
SELECT prices_date,
prices_time,
prices_open
FROM tableprices
WHERE ticker_id = 732
AND ( prices_date >= [startdate]
AND prices_date <= [enddate] )
ORDER BY prices_date ASC,
prices_time ASC;
Это не сработает для вас?
Комментарии:
1. Привет, @Chris, это кажется более логичным, но в нем говорится о синтаксической ошибке MySQL. Я изучаю это.
2. Привет, @Chris, он просто продолжает говорить мне
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '12:00:00 AM AND Prices_Date <= 06/06/2014 12:00:00 AM) ORDER BY Prices_Date ASC,' at line 1
, видите ли вы здесь какую-либо проблему? Я не смог..3. @Shyuan — возможно, потому, что вам нужно заключить свои даты в одинарные кавычки (например: ’06/06/2014 12:00:00 AM’).
4. Крис, да, я пробовал это, когда запускаю код, кажется, это работает, но это заняло больше времени, чем если бы я выполнял запрос напрямую. Сегодня я попробую еще раз и посмотрю, в чем проблема. Спасибо 🙂