powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Between с датами
9 сообщений из 9, страница 1 из 1
Between с датами
    #33454186
Конструирую запрос, условие отбора для него задаю так:

Private Function WhereConstruct(term1 As Date, term2 As Date) As String
Dim str As String
str = "WHERE tblTab1.date Between '" & term1 & "' And '" & term2 & "';"
WhereConstruct = str
End Function

т.е. отбираю данные в определенном временном отрезке.
Выдает ошибку "несоответствие типов данных" (за остальные части запроса ручаюсь).
Что у меня неправильно?
...
Рейтинг: 0 / 0
Between с датами
    #33454249
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для Access дату нужно выдавать в американском формате, заключенную в символы "#"

Код: plaintext
1.
2.
3.
4.
'для Access
public function Date2SQL(dtmdate as date) as string
  Date2SQL = "#" & Format(dtmDate, "MM/DD/YYYY") & "#"
end function
для MS SQL в следующем формате
Код: plaintext
1.
2.
3.
'для MSSQL
public function Date2SQL(dtmdate as date) as string
  Date2SQL = "'" & Format(dtmDate, "YYYYMMDD") & "'"
end function

и вот так вот доработайте свою ф-цию
Код: plaintext
1.
2.
3.
4.
5.
Private Function WhereConstruct(term1 As Date, term2 As Date) As String
Dim str As String
str = "WHERE tblTab1.date Between " & Date2SQL(term1) & " And " & Date2SQL(term2) & ";"
WhereConstruct = str
End Function
...
Рейтинг: 0 / 0
Between с датами
    #33454251
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СУБД какая?
...
Рейтинг: 0 / 0
Between с датами
    #33455580
Да в ассессе я все это делаю. Насчет дат - просто протупил, переутомился вчера. За сове HandKotу отдельная большая благодарность!
...
Рейтинг: 0 / 0
Between с датами
    #33455656
Одного только не пойму: почему когда term1 и term2 совпадают (т.е. выборка по одному дню делается) приложение в vb возвращает пустой рекордсет а ассесовский запрос (точно такой же!) делает нормальную выборку?!
...
Рейтинг: 0 / 0
Between с датами
    #33455664
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такого быть, вроде, не должно

поставьте брекпоинт после формирования строки запроса посмотрите и выполните его в Акцесе
...
Рейтинг: 0 / 0
Between с датами
    #33455677
ИгорьЧерниенкоОдного только не пойму: почему когда term1 и term2 совпадают (т.е. выборка по одному дню делается) приложение в vb возвращает пустой рекордсет а ассесовский запрос (точно такой же!) делает нормальную выборку?!

сомнительно что-то, чтобы акцесс нормальную выборку выдавал. не может этого быть. То есть - на слово не верим, а считаем, что, вероятно, в запросе акцесса есть некоторое отличие, которое Вы не видите гдазами.
Запрос не должен работать.
по существу дела.
Для провеки значений выражений в среде vba можно использовать окно "немедленных вычислений" - Immediate
Если на системе с установленным разделитетелем даты "." в таком окне набрать выражение:

Код: plaintext
?  "#" & Format(Date, "MM/DD/YYYY") & "#"

И нажать Enter, то в ответ Вы полчите

Код: plaintext
# 12 . 24 . 2005 #

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

Если он по каким-то причинам в акцесс работает, то, с одной стороны, это происходит исключительно потому, что акцесс своим нутряным мозговым усилием догадывается, что ему хотели дать дату и просто исправляет полученную грязь, на то, что он посчитает ближайшей правдоподобной датой.
С друголй стороны - это крайне печально, что акцесс проявляет такую непрошенную умность. ПОскольку, увидев возврат данных от такого запроса человек, его составивший скореее всего даже не будет подозревать, что не всякий день в нодй он увидит именно то, что рассчитывал попросить от акцесса. Если так происходит, то нужно признать, что, фактически, акцесс обманывает пользователя, оставляя его в неведении как о допущенной пользователем ошибке, так и оставляет на будущее состояние глубокого изумления пользователя, получившего "не те" данные от запроса, который пользователь от чистого сердца будет считать запрос правильным.

Правильно оформленная дата в американском формате в данном случае должна выглядеть так
Код: plaintext
# 12 / 24 / 2005 #

проблема выражения Format(Date, "MM/DD/YYYY") в том, что символ / в строке формата является указанием на то, что в данном месте должен должен стоять системный разделитель даты. Если в системе разделитель даты "-", то именно этот символ и появится. То есть / в строке формата - это специальный символ,
и, для того, чтобы получить в выходной строке именно /, то нужно отменить действие / как специального шаблонного форматного символа.
Для этого служит другой специальный символ \ означающий что следующий за ним символ не должен проверяться на "специальность". всякая специальность следующего символа, каким бы он ни был, отменяется и он просто дорлжен попасть в выходной поток.
Таким образом, для того, чтобы получить в выходном потоке символ / в строке
формата необходимо использовать конструкцию \/
Правильно свормированная строка формата, возвращающая значение, которое в Jet запросе будет интерпретировано как значение даты, будет выглядеть так
мфкВфеу - переменная типа дата
Код: plaintext
"#" & Format(varDate, "MM\/\DD\/YYYY") & "#"
или
Код: plaintext
Format(varDate, "\#MM\/\DD\/YYYY\#") 
или
Код: plaintext
cdbl(varDate) 
...
Рейтинг: 0 / 0
Between с датами
    #33455684
замечание
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
при прямом слеплении значения cdbl в строку вида
Код: plaintext
"что-то BETWEEN " & cdbl(data1) & " AND " cdbl(data2)
будет ошибка, поскольку преобразование будет проведено по правилм CStr.

Правильное оформление строки для такого случая
Код: plaintext
"что-то BETWEEN " & str(cdbl(data1)) & " AND " str(cdbl(data2))
...
Рейтинг: 0 / 0
Between с датами
    #33456536
В общем-то я сам разобрался. Причиной всему была именно невнимательность.
Да не должен он работать-у большое спасибо за развернутый ответ.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Between с датами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]