Уравнение даты и времени не возвращает значения. SQL Server 2008
строка s = @"select * from Bill_Detail, где DateTimeofBilling='" + mcCalendar.SelectionStart.ToShortDateString()
так что у меня есть этот код. mcCalendar имеет значение '20.08.2013' из-за toshortdatestring. Мне просто нужно получить все строки с даты, mcCalendar.
так что, это
выберите * из Bill_Detail, где DateTimeofBilling = '8/20/2013'
DateTimeofBilling для таблицы базы данных - это тип данных DateTime. sqlserver 2008
Почему я не могу получить строки, которые я ожидаю получить с помощью этого кода?
4 ответа
Я думаю, что ToShortDateString
фактически не возвращает значение, которое вы хотите, в любом случае, по культурным причинам. Правильное решение - не изменять обработку текста, а использовать параметризованный запрос:
string sql = "select * from Bill_Detail where DateTimeofBilling=@QueryDate";
using (var command = new SqlCommand(sql, conn))
{
command.Parameters.Add("@QueryDate", SqlDbType.Date).Value =
mcCalendar.SelectionStart.Date;
// Execute the command
}
Всегда используйте параметризованные запросы вместо создания строки SQL, содержащей значения:
- Это позволяет избежать SQL-инъекций
- Это позволяет избежать проблем с преобразованием данных, как этот
- Это помогает отделить ваш код (SQL) от данных, что облегчает понимание того, что происходит
Это происходит потому, что вы удалили элемент time из предложения where.
Например, если у вас есть значение: "20.08.2013 00:00:00", то ожидается полное DateTime
параметр.
Есть несколько способов исправить это.
1) Используйте следующий SQL:
string s = @"select * from Bill_Detail where DateTimeofBilling like '"
+ mcCalendar.SelectionStart.ToShortDateString() + "%'";
ИЛИ ЖЕ
2) Удалите "ToShortDateString", чтобы параметр, через который вы проходите, указывал полные дату и время (mcCalendar.SelectionStart = 20.08.2013 00:00:00)
string s = @"select * from Bill_Detail where DateTimeofBilling = '"
+ mcCalendar.SelectionStart + "'";
Если ваш сервер настроен на дату в британском стиле (дд / мм / гггг) вместо стиля в США (мм / дд / гггг), это может стать причиной ваших проблем. Попробуйте указать дату как "дд-ммм-гггг".
string queryDate = mcCalendar.SelectionStart.Date.ToString("dd-MMM-yyyy");
string s = "SELECT * FROM Bill_Detail WHERE DateTimeofBilling = '" + queryDate + "'";
string s = @"select * from Bill_Detail where DateTimeofBilling=CONVERT(date, '" + mcCalendar.SelectionStart.ToShortDateString() + "'); "
Должен делать то, что вы ищете (у вас не было закрытия в конце). Но да, параметризованные запросы намного лучше.
Посмотрите, возвращает ли следующий код результаты. Если название вашего поля указано правильно, возможно, вы искали '08/20/2013 12:00:00'без конвертации.
select * from Bill_Detail where CONVERT(date, DateTimeofBilling)='08/20/2013';