2014-12-14 4 views
0

У меня есть веб-форма, которая запрашивает базу данных Access для записей журнала и предоставляет различные статистические данные о них; например, дать мне общее количество записей журнала и общее количество записей журнала для определенной темы. Я хотел бы иметь возможность ввести дату начала и дату окончания, и будет подсчитано общее количество записей журнала, которые находятся между этими двумя датами.Расчет общего количества записей между двумя датами

До сих пор у меня есть два текстовых полей с календарем Jquery, но при выборе два дат и кнопка поиска нажата, это не подбирая нужное количество итоговых записи в журнале и возвращает 0.

дату-время Picker пут дату в формате: mm/dd/yyyy, а база данных Access имеет поле JournalDate, отформатированное как Date/Time. Другими словами, база данных Access содержит даты как 4/8/2014, а DataTime Picker отображает их в текстовом поле как 04/08/2014. Я думал, что преобразование их с помощью синтаксического анализа сделало бы трюк, но оно все равно возвращает 0 для общего количества записей журнала, когда даты выбраны. Любая помощь будет очень высоко ценится.

Он также открыт для SQLInjection прямо сейчас.

DateTime StartDate = DateTime.Parse(txtStartDate.Text); 
DateTime EndDate = DateTime.Parse(txtEndDate.Text); 

using (OleDbConnection con = new OleDbConnection(constr)) 
    using (OleDbCommand com = new OleDbCommand("SELECT * FROM JournalEntries WHERE JournalDate BETWEEN " + txtStartDate.Text + " and " + txtEndDate.Text, con)) 
    { 
     con.Open(); 
     using (OleDbDataReader myReader = com.ExecuteReader()) 
     { 
      DataTable dt = new DataTable(); 
      dt.Load(myReader); 
      int count = dt.Rows.Count; 
      JournalEntryTotal.Text = count.ToString(); 
     } 
    } 

ответ

1

Скорее всего, это проблема преобразования даты.

Я не думаю, что это хорошая практика для обработки полей строки даты даты без явного предоставления формата. Это может быть, например, ваш txtStartDate - 04/08/2014 на 08 апреля 2014 года и txtEndDate - 05/03/2014 на 03 мая 2014 года, и имеет смысл искать записи между этими датами, но если формат по умолчанию - dd/MM/yyyy вы получите 04 августа 2014 года и 05 марта 2014 года для даты начала и окончания даты соответственно, и поиск данных между этими датами дает 0 результатов.

Аналогично, в запросе sql, который вы используете, вы должны использовать функцию преобразования даты вместо того, чтобы полагаться на формат по умолчанию. Так что он должен читать что-то вроде этого (я использую функцию дата оракул преобразования, но там должно быть что-то подобное в доступе):

"SELECT * FROM JournalEntries WHERE JournalDate BETWEEN to_date('" + txtStartDate.Text + "', 'mm/dd/yyyy') and to_date('" + txtEndDate.Text + "', 'mm/dd/yyyy')" 

И еще одно слово о полей даты и форматов. Даты не имеют форматов. Дата представляет собой конкретный момент времени. 10 августа 2014 10:23:05 EST - это тот же день, независимо от того, как вы его пишете. Когда вы пишете его, вы используете формат, чтобы отображать его, чтобы тот, кто его читает, понимает, в какой именно момент времени вы обращаетесь.

+0

to_date, работает ли это с базами данных Access? – Michael

0

Я бы сначала настройтесь запрос сам, то есть в MS SQL maangement студии, а затем отформатировать дату правильный формат, то есть:

Format(Me.DateTimePicker1.Value, "MM/dd/yyyy") 

Если вы пробовали, я подозреваю, что ваша проблема в верхний/нижний регистр строки формата. Обратите внимание, что этот месяц является верхним регистром, а остальное - строчным (важно!). Не похоже на то, что вы написали выше: mm/dd/yyyy.

С уважением,

Libor

Смежные вопросы