нужна помощь в сравнении дат в доступе через vba

#sql #vba #date #ms-access

Вопрос:

У меня следующая проблема: не удается заставить sql — запрос работать с датами. Следующий запрос:

 strRowSource = "SELECT [ID],[TaskType],[TaskName],[StartDate],[EndDate],[isFinished] " amp; _
"FROM tblTasks " amp; "WHERE [Person] = " amp; TempVars("CurrentUser") amp; " AND [EndDate] < #" amp; Format(Now(), "short date") amp; "#"
 

Не возвращает никакого значения. то, что я пытаюсь получить, — это список задач, которые просрочены.

Заранее спасибо

Комментарии:

1. Попробуй Format(Date, "mm/dd/yyyy") .

2. нет, не работает. я выдергиваю волосы и уже перепробовал десятки различных подходов

Ответ №1:

Я использую эту удобную функцию для форматирования дат:

 Public Function JetSqlDate(ByVal d As Variant) As String
    If IsNull(d) Then
        JetSqlDate = "NULL"
    Else
        JetSqlDate = Format$(d, "#mm/dd/yyyy hh:nn:ss#")
    End If
End Function
 

Использование:

 strRowSource = "SELECT ID, TaskType, TaskName, StartDate, EndDate, isFinished " amp; _
  "FROM tblTasks WHERE Person = " amp; TempVars("CurrentUser") amp; _
  " AND EndDate < " amp;  JetSqlDate(Now())
 

Обратите внимание, что экранирование имен столбцов ( [] ) требуется только в том случае, если они содержат недопустимые символы, такие как пробелы, или когда они конфликтуют с ключевыми словами. Например, если бы у вас был столбец с именем From , вам пришлось бы записать его как [From] .


для сквозных запросов SQL-сервера я использую:

 Public Function TSqlDate(ByVal d As Variant) As String
    If IsNull(d) Then
        TSqlDate = "NULL"
    Else
        TSqlDate = "{ ts '" amp; Format$(d, "yyyy-mm-dd hh:nn:ss") amp; "' }"
    End If
End Function
 

Для струн:

 Public Function SqlStr(ByVal s As String) As String
'Input: s=""      Returns: NULL
'Input: s="abc"   Returns: 'abc'
'Input: s="x'y"   Returns: 'x''y'

    If s = "" Then
        SqlStr = "NULL"
    Else
        SqlStr = "'" amp; Replace(s, "'", "''") amp; "'"
    End If
End Function
 

Обратите внимание, что эта функция добавляет разделители и экранирует любые разделители, содержащиеся в строковом значении. Это делает запросы более надежными, а также предотвращает внедрение SQL.

Комментарии:

1. Идеальный Оливье — это действительно работает 🙂 tyvm

2. Я хотел бы озвучить ответ, но для этого требуется не менее 15 повторений. Тем не менее, принял ответ с галочкой. Спасибо, что объяснили мне, как здесь все работает

Ответ №2:

Вы могли бы сократить его до:

 strRowSource = "SELECT ID, TaskType, TaskName, StartDate, EndDate, isFinished " amp; _
    "FROM tblTasks " amp; _
    "WHERE Person = " amp; TempVars("CurrentUser") amp; " AND EndDate < Now()"