-
Есть таблица, в которой поля даты и времени - два разных поля. Нужно из таблицы выбрать записи в определенном временном интервале. Делал так:
S := '(SELECT Call,(DateQSO+TimeQSO) AS DateTimeQSO FROM RX4HX) AS L';
CommandText := 'SELECT Call, DateTimeQSO FROM ' + S + ' WHERE (L.DateTimeQSO >:DateTimeQSO)';
Не работает. Если поле DateTimeQSO (которое в исходной таблице не существует, а является суммой полей DateQSO+TimeQSO) заменить на поле, которое существует в исходной таблице - все работает. В чем моя ошибка?
-
ошибка в условии where
-
Почему не срабатывает составной запрос
потому что нет записей, удовлетворяющих условию where
-
Не работает, а что пишет?
-
> удовлетворяющих условию where
Почему нету? В параметр :DateTimeQSO я записываю заведомо существующий временной параметр. А записи НАОБОРОТ - все показываются, хотя должны только начиная во времени заданным параметром :DateTimtQSO.
-
Почему нету?
Потому что "не работает"
-
если б они были, сервер возвращал бы выборку.
-
> возвращал бы выборку.
Так он возвращает выборку. Только не поймешь какую. Сейчас поэкспериментировал - вроде как получается ACCESS не умеет так делать? Сейчас для пробы сделал так:
S := '(SELECT Call,(DateQSO+TimeQSO) AS DateTimeQSO FROM RX4HX) AS L';
with ADODataSet1 do
begin
Active := False;
CommandText := 'SELECT Call, DateTimeQSO FROM ' + S +
' WHERE (L.DateTimeQSO >:DateTimeQSO) ORDER BY L.DateTimeQSO';
ADODataSet1.Parameters.ParamByName('DateTimeQSO').Value := Now;
Active := True;
end;
Записей старше чем Now - нет. Однако возвращает записи и 2001-2011 годов. Причем не все- а часть. По какому принципу - не понятно :)
-
Alex_C (27.12.11 16:41) [4] А какого типа поле TimeQSO ?
-
Все он умеет ) Напишите типы полей и что они содержат?
-
> А какого типа поле TimeQSO ?
В Accesse только одно поле есть DateTime - соответственно поля DateQSO и TimeQSO - поля типа DateTime. Поле TimeQSO - содержит только время (значение меньше единицы.) Пробовал так:
with ADODataSet1 do
begin
Active := False;
CommandText := 'SELECT Call,(DateQSO+TimeQSO) AS DateTimeQSO FROM RX4HX';
Active := True;
end;
Все отображается корректно.
-
with ADODataSet1 do begin Active := False; CommandText := 'SELECT Call,(DateQSO+TimeQSO) AS DateTimeQSO FROM RX4HX WHERE (DateQSO+TimeQSO)> :(DateQSO+TimeQSO)'; Active := True; end;
А Так?
-
т.е. так 'SELECT Call,(DateQSO+TimeQSO) AS DateTimeQSO FROM RX4HX WHERE (DateQSO+TimeQSO)> :DateTimeQSO';
-
что за идиотский стиль с "кусочничеством" в запросах... неужели нельзя нормально, цельно написать? тем более что этого куска не нужно вообще + второй параметр с тем же значением и проверяй за машиной... раз не веришь with ADODataSet1 do begin
Close;
CommandText:=
'SELECT Call, DateQSO+TimeQSO AS DateTimeQSO,:DT FROM RX4HX '+
'WHERE (DateQSO+TimeQSO) > :DateTimeQSO '+
'ORDER BY 2';
Parameters.ParamByName('DT').Value:= Now;
Parameters.ParamByName('DateTimeQSO').Value:= Now;
Open;
end;
-
> А Так?
Так пробовал с самого начала - но, как я понял так точно не работает - после WHERE выражения не вычисляюся. Еще ранее в других местах пробовал - заставить вычисляться выражения не смог, вот способ с 2-я запросами и использовал.
Результат [12] аналогичен результату [7] - из 10 тыс записей, возвращается 1100, но логику возвращенных записей понять не смог - даты от 2001 до 2011 года.
-
И еще, не всегда корректно автоматически определяется тип параметров, лучше задавать явно.
-
> что за идиотский стиль
См. [14] - делал так с самого начала. Результаты у [7],[12],[14] - один и тот же - > из 10 тыс записей, возвращается 1100, но логику возвращенных > записей понять не смог - даты от 2001 до 2011 года.
-
Alex_C (27.12.11 17:13) [14] В самом акцессе пробовал? я даже сделал табличку наполнил и проверил :) все вычисляется и правильно работает.
-
> не всегда корректно автоматически определяется тип параметров
Да согласен - особенно это у DateTime чуствителен. Но тут все четко - все параметры заданы как DateTime.
-
> + второй параметр с тем же значением и проверяй за машиной. > .. раз не веришь
На его месте пишется (VARBYTES) - по ходу все же это проблемы Access'а...
|