Конференция "Базы" » Почему не срабатывает составной запрос [D7, Access]
 
  • Alex_C (27.12.11 16:18) [0]
    Есть таблица, в которой поля даты и времени - два разных поля. Нужно из таблицы выбрать записи в определенном временном интервале. Делал так:


     S := '(SELECT Call,(DateQSO+TimeQSO) AS DateTimeQSO FROM RX4HX) AS L';
     CommandText := 'SELECT Call, DateTimeQSO FROM ' + S + ' WHERE (L.DateTimeQSO >:DateTimeQSO)';



    Не работает. Если поле DateTimeQSO (которое в исходной таблице не существует, а является суммой полей DateQSO+TimeQSO) заменить на поле, которое существует в исходной таблице - все работает. В чем моя ошибка?
  • Медвежонок Пятачок © (27.12.11 16:26) [1]
    ошибка в условии where
  • Медвежонок Пятачок © (27.12.11 16:27) [2]
    Почему не срабатывает составной запрос

    потому что нет записей, удовлетворяющих условию where
  • stas © (27.12.11 16:27) [3]
    Не работает, а что пишет?
  • Alex_C (27.12.11 16:41) [4]

    > удовлетворяющих условию where


    Почему нету? В параметр :DateTimeQSO я записываю заведомо существующий временной параметр. А записи НАОБОРОТ - все показываются, хотя должны только начиная во времени заданным параметром :DateTimtQSO.
  • Медвежонок Пятачок © (27.12.11 16:47) [5]
    Почему нету?

    Потому что "не работает"
  • Медвежонок Пятачок © (27.12.11 16:48) [6]
    если б они были, сервер возвращал бы выборку.
  • Alex_C (27.12.11 16:57) [7]

    > возвращал бы выборку.


    Так он возвращает выборку. Только не поймешь какую.
    Сейчас поэкспериментировал - вроде как получается 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 годов. Причем не все- а часть. По какому принципу - не понятно :)
  • stas © (27.12.11 16:59) [8]
    Alex_C   (27.12.11 16:41) [4]
    А какого типа поле TimeQSO ?
  • stas © (27.12.11 17:00) [9]
    Все он умеет )
    Напишите типы полей и что они содержат?
  • Alex_C (27.12.11 17:04) [10]

    > А какого типа поле 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;



    Все отображается корректно.
  • stas © (27.12.11 17:08) [11]
    with ADODataSet1 do
    begin
     Active := False;
     CommandText := 'SELECT Call,(DateQSO+TimeQSO) AS DateTimeQSO FROM RX4HX WHERE (DateQSO+TimeQSO)> :(DateQSO+TimeQSO)';
     Active := True;
    end;

    А Так?
  • stas © (27.12.11 17:08) [12]
    т.е. так
    'SELECT Call,(DateQSO+TimeQSO) AS DateTimeQSO FROM RX4HX WHERE (DateQSO+TimeQSO)> :DateTimeQSO';
  • sniknik © (27.12.11 17:11) [13]
    что за идиотский стиль с "кусочничеством" в запросах... неужели нельзя нормально, цельно написать? тем более что этого куска не нужно вообще

    + второй параметр с тем же значением и проверяй за машиной... раз не веришь
     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;

  • Alex_C (27.12.11 17:13) [14]

    > А Так?


    Так пробовал с самого начала - но, как я понял так точно не работает - после WHERE выражения не вычисляюся. Еще ранее в других местах пробовал - заставить вычисляться выражения не смог, вот способ с 2-я запросами и использовал.

    Результат [12] аналогичен результату [7] - из 10 тыс записей, возвращается 1100, но логику возвращенных записей понять не смог - даты от 2001 до 2011 года.
  • stas © (27.12.11 17:16) [15]
    И еще, не всегда корректно автоматически определяется тип параметров, лучше задавать явно.
  • Alex_C (27.12.11 17:16) [16]

    > что за идиотский стиль


    См. [14] - делал так с самого начала.
    Результаты у [7],[12],[14] - один и тот же -
    > из 10 тыс записей, возвращается 1100, но логику возвращенных
    > записей понять не смог - даты от 2001 до 2011 года.
  • stas © (27.12.11 17:17) [17]
    Alex_C   (27.12.11 17:13) [14]
    В самом акцессе пробовал? я даже сделал табличку наполнил и проверил :) все вычисляется и правильно работает.
  • Alex_C (27.12.11 17:17) [18]

    > не всегда корректно автоматически определяется тип параметров


    Да согласен - особенно это у DateTime чуствителен. Но тут все четко - все параметры заданы как DateTime.
  • Alex_C (27.12.11 17:19) [19]

    > + второй параметр с тем же значением и проверяй за машиной.
    > .. раз не веришь


    На его месте пишется (VARBYTES) - по ходу все же это проблемы Access'а...
 
Конференция "Базы" » Почему не срабатывает составной запрос [D7, Access]
Есть новые Нет новых   [134431   +10][b:0][p:0.002]