Доступ к оператору SQL для получения всех данных между двумя датами

Мне нужна помощь в кодировании, чтобы получить все данные за две даты с двумя DateTimePickers.

  • dtpDateFrom
  • dtpDateTo

Так что если я поставлю dtpDateFrom = 06/01/14 и dtpDateTo = 06/30/14, я получу все данные в июне.

У меня пока есть этот код:

Public Shared Function GetNoofHoursofTImeIn(ByVal search As String, ByVal dfrom As DateTime, ByVal dto As Datetime) As DataTable

    Dim dtoffenseinfo As New DataTable

    If Not DBConnection.State = ConnectionState.Open Then
        'open connection
        DBConnection.Open()
    Else

    End If


    Dim adapter As New OleDbDataAdapter("SELECT sum(No_of_Hour) as THour from EmployeeAttendance where EmployeeID='" & search & "'" & _
                                          "and Format(WorkingDate, 'Short Date')>='" & Format(dfrom, "Short Date") & _
                                  "' and Format(WorkingDate, 'Short Date')<='" & Format(dto, "Short Date") & "'", DBConnection)

    adapter.Fill(dtoffenseinfo)
    DBConnection.Close()


    Return dtoffenseinfo
End Function

У меня есть данные за 6.09.14 и 06.12.14, но они не работают должным образом.

Итак, я ищу идеальный код для этой цели.

Большое спасибо! Основная функция, над которой я работаю неделями.


person user3522506    schedule 14.06.2014    source источник
comment
Ваш код выглядит как MS Access, поэтому я добавил правильный тег.   -  person Gordon Linoff    schedule 14.06.2014
comment
Ах да, я забыл. Большое спасибо.   -  person user3522506    schedule 14.06.2014
comment
если столбцы db являются фактическими типами даты (они должны быть), вы можете использовать МЕЖДУ см. stackoverflow.com/a/3168598/1070452   -  person Ňɏssa Pøngjǣrdenlarp    schedule 14.06.2014
comment
Почему бы не использовать параметры запроса. Тогда вам не нужно беспокоиться о формате даты. Просто сравните с Between   -  person Fabio    schedule 14.06.2014


Ответы (3)


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

"SELECT sum(No_of_Hour) as THour from EmployeeAttendance where EmployeeID='" & search & "'" & _
                                          "and Format(WorkingDate, 'Short Date') between(" & Format(dfrom, "Short Date") & _
                                  ","& Format(WorkingDate, 'Short Date')& ")"
person K.K.Agarwal    schedule 14.06.2014
comment
Большой! Я попытаюсь исправить это, так как я получаю выражение, ожидаемое через запятую в последнем формате (WorkingDate, 'Short Date') &). Спасибо за предложение @ K.K.Agarwal! - person user3522506; 14.06.2014
comment
Форматы не влияют на то, как значения хранятся в таблице. Если вам нужна только часть даты, используйте функцию DateValue и для эффективности не работайте со значением поля. WorkingDate Between '& DateValue (dFrom) &' AND '& DateValue (dTo) + 1 &' обратите внимание на +1 с dTo. Это позволяет вам включать значения, содержащие компонент времени, без преобразования их всех в значения только по дате - гораздо более эффективно. - person AVG; 14.06.2014

Это немного долго для комментария.

Вы конвертируете свои даты в строки для сравнения. Таким образом, вы получаете строки типа «6/09/14» и «6/12/14». Угадайте, что «6/10/13» находится между этими значениями. Так и «6/10/22». Чтобы сравнение строк работало, вам необходимо отформатировать даты как ГГГГ-ММ-ДД (или ГГГГММДД).

Удалите функцию format() и выполните сравнения как даты.

person Gordon Linoff    schedule 14.06.2014
comment
Хм. Я использовал Format ('Short Date'), чтобы удалить значения TIME, которые я получаю из DateTimePickers. Да, возможно, я что-то там упустил. - person user3522506; 14.06.2014
comment
@ user3522506. . . На самом деле я не знаю, как вставить константу даты из VBA в Access. Но это все, что вам нужно. - person Gordon Linoff; 14.06.2014
comment
хорошо, у меня раньше был плохой опыт чтения правильных форматов даты, но я снова буду возиться с ними, пока не получу это правильно и, наконец, не найду постоянное решение. Большое спасибо! Ваше здоровье. - person user3522506; 14.06.2014

Как предлагается в одном из комментариев к вопросу, вам действительно следует использовать параметризованный запрос. В вашем конкретном случае код будет выглядеть примерно так:

Public Shared Function GetNoofHoursofTImeIn(ByVal search As String, ByVal dfrom As DateTime, ByVal dto As DateTime) As DataTable
    Dim dtoffenseinfo As New DataTable

    If Not DBConnection.State = ConnectionState.Open Then
        'open connection
        DBConnection.Open()
    End If

    Using cmd As New OleDbCommand
        cmd.Connection = DBConnection
        cmd.CommandText = _
                "SELECT SUM(No_of_Hour) AS THour FROM EmployeeAttendance " & _
                "WHERE EmployeeID = ? " & _
                    "AND WorkingDate BETWEEN ? AND ?"
        cmd.Parameters.AddWithValue("?", search)
        cmd.Parameters.AddWithValue("?", dfrom.Date)
        cmd.Parameters.AddWithValue("?", dto.Date)
        Using adapter As New OleDbDataAdapter(cmd)
            adapter.Fill(dtoffenseinfo)
        End Using
    End Using

    DBConnection.Close()
    Return dtoffenseinfo
End Function
person Gord Thompson    schedule 14.06.2014
comment
Ой. Я получаю сообщение Преобразование типа "DBNull" в тип "String" недействительно. Могут ли у меня быть конфликты типов данных в MS Access? Спасибо за знания! Я попробую погуглить эту ошибку в этом случае. - person user3522506; 15.06.2014