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

#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. Крис, да, я пробовал это, когда запускаю код, кажется, это работает, но это заняло больше времени, чем если бы я выполнял запрос напрямую. Сегодня я попробую еще раз и посмотрю, в чем проблема. Спасибо 🙂