#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()"