«Между» не работает, где ошибка в моем коде?

#c# #mysql #date

#c# #mysql #Дата

Вопрос:

Я хотел бы обратиться за помощью, потому что по какой-то причине предложение SQL с BETWEEN у меня не работает — я получаю 0 результатов.

При вставке записи я сохраняю дату следующим образом:

 ..
commandObject.Parameters.Add("date", c.Found.Date);
 

Проблема у меня в том, что это никогда не работает:

  commandObject.Parameters.Add("from", dateTimePicker_FROM.Value.Date.ToShortDateString());
                    commandObject.Parameters.Add("to", dateTimePicker_TO.Value.Date.ToShortDateString());
                    commandObject.CommandText = "Select * from Persons WHERE Date BETWEEN @from AND @to";
 

Другие выбирает и т.д. работает просто отлично.

Комментарии:

1. Можете ли вы показать нам результат c.Date.ToShortDateString() ?

2. не могли бы вы объяснить doesn't work точнее? и предоставить некоторые примеры данных? мое первое слепое предположение, однако, исходит из ToShortDateString — зачем работать со строками вместо datetimes в вашей базе данных? у них разное поведение при сравнении, и вы обычно хотите дату и время.

3. @TimBiegeleisen При отладке это сохраняется в параметре: {1/19/2021 12:00:00 утра}

4. используйте это ПРЕОБРАЗОВАНИЕ (datetime, @from)

5. В MySQL даты должны быть ‘y-m-d’, а время даты должно быть ‘y-m-d h: i: s’

Ответ №1:

При использовании условия BETWEEN в MySQL с датами обязательно используйте функцию ПРИВЕДЕНИЯ для явного преобразования значений в даты.

Следующий пример даты использует условие BETWEEN для извлечения значений в диапазоне дат:

ВЫБЕРИТЕ * ИЗ example_tbl, ГДЕ order_date МЕЖДУ ПРИВЕДЕНИЕМ (‘2021-01-19’ В КАЧЕСТВЕ ДАТЫ) И ПРИВЕДЕНИЕМ (‘2021-01-20’ В КАЧЕСТВЕ ДАТЫ);

дополнительная информация по адресу: https://www.techonthenet.com/mysql/between.php

Комментарии:

1. Спасибо, синтаксис сработал, но я все равно получаю 0 результатов: (

2. Вам не нужно это приведение; MySQL понимает строки в формате ‘гггг-ММ-дд’ как даты

Ответ №2:

Вы хотите передавать свои даты как даты, а не строки:

  commandObject.Parameters.Add("from", dateTimePicker_FROM.Value.Date);
 

Ответ №3:

Я не совсем уверен, почему вы, кажется, сохраняете дату (и задаете параметр даты), но когда вы выполняете поиск, вы используете строки вместо дат

Вы сказали:

 commandObject.Parameters.Add("date", c.Found.Date);
 

Это кажется шатким; Я не помню перегрузки Add, которая принимает строку и значение (при условии, что вы используете соединитель MySQL) — вы имели в виду AddWithValue ?

Я предполагаю, что:

  • вы хотели сказать AddWithValue
  • ваш запрос выглядит как `ВСТАВИТЬ В ЗНАЧЕНИЯ T (…, @date, …)
  • ваш параметр «date» используется для столбца, в котором хранятся дата, дата-время или отметка времени
  • c.Found — это c # datetime, и вы используете свойство Date, чтобы установить время на полночь

Предположим, что c.Found есть 2020-01-02 12:34:56 , это означает, что ваша таблица должна заканчиваться 2020-01-02 00:00:00

Теперь установите для ваших средств выбора значения 2020-01-01 и 2020-01-03

Запустите поиск следующим образом:

 SELECT * FROM t WHERE date BETWEEN @f AND @t
 

Задайте свои параметры следующим образом:

 commandObject.Parameters.AddWithValue("@f", fromPicker.Value.Date);
commandObject.Parameters.AddWithValue("@f", toPicker.Value.Date);
 

Т.е. сделайте их датами, а не строками

И это будет работать

Значение BETWEEN включено на обоих концах диапазона, поэтому средство выбора from или средство выбора to может быть 2020-01-02, и оно все равно будет отображаться. Считайте, что даты похожи на целые числа, а времена — на десятичные дроби. 2020-01-02 00:00:00 похоже на 2.0, 2020-01-02 18:00:00 похоже на 2.75, 2020-01-03 00: 00:00 похоже на 3.0. Это означает, что МЕЖДУ 2020-01-02 И 2020-01-03 будет получать что-либо с полуночи в эти даты, и все между ними, как МЕЖДУ 2 И 3, даст вамстроки с 2, 2.5, 3… но это не даст вам 3.5, и точно так же это не даст вам 2020-01-03 12:00:00, если между заканчивается на 2020-01-03

Комментарии:

1. Спасибо, я использую встроенную базу данных sqldatabase, и единственным методом добавления пары параметров является Add . Нет метода AddWithValue .

2. Тогда вы можете просто настроить совет на использование Add .. Или опубликуйте дополнительную информацию о том, что именно вы используете. Единственная подсказка, которую вы даете, — это тег «mysql», поэтому я выбрал совет MySQL