2012-06-16 2 views
2

У меня есть следующая проблема. Я написал запрос, чтобы получить дату заказа в C#:Поиск записей между заданным диапазоном дат в sql с столбцом varchar

QueryDate = string.Format("(Order.Begin>= '{0}' and Order.End<= '{1}')", BeginDate, EndDate); 

Проблема заключается в моих столбцах таблицы SQL Server, «Begin» и «End», являются VARCHAR столбцов, и я хочу, чтобы держать их таким образом. Например, они сохраняются как '12 -4-2012 '.

Теперь, чтобы увидеть даты, попробуйте нажать '12 -4-2012 'и '19 -4-2012. Но результатом является все между «12» и «19» с первыми двумя цифрами. Таким образом, результаты также включают, например, «14 -8-2011».

Есть ли способ получить только даты между '12 -4-2012 'и '19 -4-2012' со столбцом строки?

+2

Это очень плохой дизайн. Нет простого способа сделать это, не используя сложное преобразование строк, которые калечат механизм оптимизации SqlServer. – Steve

+2

Хранение дат как строк - очень плохой дизайн. Что такое 12-4, 12 апреля или 4 декабря? Построение такой строки SQL также попросит SQL-атаки на атаку –

+0

12 апреля. Пользователь использует DateTimePicker, а формат по умолчанию - dd-MM-yyyy, и это скрывается в строке. И программа является внутренней. Он не может быть выполнен с нашего сервера, если вы не входите в наш домен. – Drabe

ответ

1

Я думаю, что вы можете преобразовать Бегин и порядок столбцов в формате DateTime что-то вроде это:

QueryDate = string.Format("(convert(datetime, Order.Begin, 105) >= @startdate and convert(datetime, Order.End, 105)<= @enddate;"

а затем добавьте он @startdate и параметры @enddae ...

1

Используйте параметры и инкапсулировать вам имена столбцов с помощью квадратных скобок
Тогда предполагающих свои входные строки действительны даты вы можете сделать:

DateTime dStart = DateTime.ParseExact(BeginDate, "dd/MM/yyyy", CurrentCulture.CultureInfo); 
DateTime dEnd = DateTime.ParseExact(EndDate, "dd/MM/yyyy", CurrentCulture.CultureInfo); 

string QueryDate = "SELECT * FROM Order " + 
        "WHERE CONVERT('smalldatetime', [Begin], 105) >= @start " + 
        "AND CONVERT('smalldatetime', [End], 105) <= @end"; 
SqlCommand cmd = new SqlCommand(QueryDate, con); 
cmd.Parameters.AddWithValue("@start", dStart); 
cmd.Parameters.AddWithValue("@end", dEnd); 
SqlDataReader reader = cmd.ExecuteReader(); 
0

Не было бы такой возможностью?

string.Format("(convert(datetime, Order.Begin, 105)>= convert(datetime, '{0}', 105) and convert(datetime, Order.End, 105)<= convert(datetime, '{1}', 105))", BeginDate, EndDate); 
Смежные вопросы