Уравнение даты и времени не возвращает значения. 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';
Другие вопросы по тегам