Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запрос на выборку
 
 автор: Zhebov_andrey   (15.01.2010 в 10:31)   личное сообщение
 
 

Делаю запрос на выборку по полю форматаДата/время (краткий формат времени, маска ввода 00:00;0;_) в поле "условие отбора" ввожу вот это: Is Not Null And Between [Введите минимальное значение] And [Введите максимальное значение], но работает не так как нужно:
В таблице имеются значения 0:18, 0:20, 0:21,0:25, 0:26, если ввести и интервал 0:00-0:20, то выбирается только значение 0:18, если ввести 0:00-0:21, тогда выбираются значения 0:18 и 0:20 а если ввести интервал 0:00-0:26, то выбираются все значения
Подскажите, как сделать правильно

  Ответить  
 
 автор: kot_k_k   (15.01.2010 в 10:49)   личное сообщение
 
 

как вариант проверь на секунды - может они хвостом висят.
Second(проле) - может не 0

Добавлено
создал такое же поле но программно внес #4:15:59 PM#
в поле показывает 16:15 а Second (поле) = 59 и при написании такого условия 16:15 - данная запись не попадала - так что смотри секунды, или убирай их

  Ответить  
 
 автор: zhebov_andrey   (15.01.2010 в 11:07)   личное сообщение
 
 

Проверил, все секунды по нолям...
Дело в том, что это поле (поле Время на вызов) вычисляемое:

Автор Snipe

Private Sub Время_возвращения_AfterUpdate()
Dim zDate As Date
Dim mDate As Date

zDate = "23:59:00"
mDate = "00:01:00"

If Me![Время возвращения] < Me![Время принятия] Then
Me![Время на вызов] = (zDate - Me![Время принятия]) + Me![Время возвращения] + mDate
Else
Me![Время на вызов] = Me![Время возвращения] - Me![Время принятия]
End If
End Sub

  Ответить  
 
 автор: kot_k_k   (15.01.2010 в 11:32)   личное сообщение
 
 

попробуй замени Between на конструкцию <= And <= а еще проверь что оно пишет если вывести запрос с условием Where поле=#" & #0:18# & "#" что оно выдаст???

и еще для проверки в функцию добавь в конце,

Me![Время на вызов] =TimeSerial(Hour(Me![Время на вызов]), Minute(Me![Время на вызов]),0)

т.к. не факт что Me![Время возвращения] - Me![Время принятия] - дает время без секунд.

вариен еще в запрос попробуй поставить в условие не поле а TimeSerial(......) от поля

  Ответить  
 
 автор: snipe   (15.01.2010 в 12:40)   личное сообщение
 
 

На сколько я помню время принятия вызова у вас ставится по умолчанию (т.е. в момент ввода инфы) отрабатывает функция) так что отсюда могут и появиться секунды

  Ответить  
 
 автор: zhebov_andrey   (15.01.2010 в 13:03)   личное сообщение
 
 

А можно подробнее объяснить как это проверить и если что отключить

  Ответить  
 
 автор: kot_k_k   (15.01.2010 в 13:25)   личное сообщение
 
 

в процедуре отрубать секунды - TimeSerial(час, минута, 0)

либо еще при вводе значений --- Me![Время возвращения] , Me![Время принятия] отрубать им секунды опять же можно использовать TimeSerial()


если ввести интервал 0:00-0:26, то выбираются все значения


т.е. получается запрос работает правильно только для значения 0:26 (он выбирает значение 0:26) - а для остальных (с меньшим интервалом) не работает - он же не человек, значит загводзка в значениях а не в запросе.

как проверить - дебагом чо получаем тут

If Me![Время возвращения] < Me![Время принятия] Then
Me![Время на вызов] = (zDate - Me![Время принятия]) + Me![Время возвращения] + mDate
Else
Me![Время на вызов] = Me![Время возвращения] - Me![Время принятия]
End If

как правило показывает полное значение 0:26:00 или добавить строки типа
T1=Second(Me![Время принятия])
T2=Second(Me![Время возвращения]) и вывести их значения на экран

скопируй оба столбца (принятие - возвращение) в пустую базу и покажи - посмотрим

  Ответить  
 
 автор: zhebov_andrey   (15.01.2010 в 19:20)   личное сообщение
43 Кб.
 
 

Вот пример прицепил, дело действительно в секундах... В принципе работает если задать интервал вот так: 0:00:00-0:20:59, но теперь интересно стало на примере посмотреть, как сделать так 0:00-0:20

  Ответить  
 
 автор: snipe   (16.01.2010 в 01:55)   личное сообщение
46 Кб.
 
 

видите ли - Between работает по принципу >=минимум and <=максимум
а вам надо >минимум-00:00:01 and <максимум+0:01

вывод - сделать отдельную форму в которой вводить интервал и в запросе опираться на эту форму

  Ответить  
 
 автор: kot_k_k   (16.01.2010 в 12:34)   личное сообщение
 
 

вот это работает!!!!


SELECT *
FROM Заболевания
WHERE (((TimeSerial(Hour([Время на вызов]),Minute([Время на вызов]),Second([Время на вызов])))=#12/30/1899 0:20:0#));


а это нет!!!!


SELECT *
FROM Заболевания
WHERE ((([Время на вызов])=#12/30/1899 0:20:0#));


дату сам конструктор вписал.

т.е. нужно использовать TimeSerial - везде!!!
вот рабочий вариант только добавь в первом условии Between преобразование TimeSerial


SELECT *
FROM Заболевания
WHERE (((TimeSerial(Hour([Время на вызов]),Minute([Время на вызов]),Second([Время на вызов]))) Is Not Null And (TimeSerial(Hour([Время на вызов]),Minute([Время на вызов]),Second([Время на вызов]))) Between [Минимальное значение] And TimeSerial(Hour([Максимальное значение]),Minute([Максимальное значение]),0)));


мое мнение - у Акса таже жопа с временем как и плав точкой типа 0,175 а у него 0,174999999 и результат иногда не сходится т.е. при сравнивании времени нужно пользоваться какми либо функциями у которых выходной результат - однозначно в формате времени

  Ответить  
 
 автор: zhebov_andrey   (17.01.2010 в 11:38)   личное сообщение
 
 

Всем большое спасибо, буду пробовать

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList