Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > как сделать запрос на sql-к полю datetime


Автор: djmix777 30.11.2014, 16:11
Код

Adoquery1.sql.add('select F1,F2,F3,F4,F5,F6 from worktime.csv ');
             Adoquery1.sql.add( ' where F2=' + label9.Caption+'');
                           Adoquery1.sql.add('group by F1,F2,F3,F4,F5,F6' );
                           Adoquery1.active := true;


так изначально было и работает конечн:

сейчас надо по F1 (столбец со значениями DATETIME) отобрать 

думал что то типа этого
Код

Adoquery1.sql.add('select F1,F2,F3,F4,F5,F6 from worktime.csv ');
              Adoquery1.sql.add( ' where F1>=''18.11.2014 17:30:00'' ');
              Adoquery1.sql.add( 'AND F2=' + label9.Caption+' ');
              Adoquery1.sql.add('group by F1,F2,F3,F4,F5,F6' );
              Adoquery1.active := true;


выходит ошибка скрин во вложении.

сколько смотрел , я так понимаю нужно поля разделять по формату, потом запрос делать? или как?

потом уже буду думать как сгруппировать оставшиеся данные.
а то если скопом то всё в word перевожу отчёт такой на 400 страниц получается....

ещё один вариант попробовал
Код

Adoquery1.sql.add('select F1,F2,F3,F4,F5,F6 from worktime.csv ');
Adoquery1.sql.add( ' where F1 BETWEEN '+ edit4.text+' AND ' + edit6.text+' AND ');
Adoquery1.sql.add( 'datepart(HOUR, F1) BETWEEN "17" AND "23" AND');
Adoquery1.sql.add( 'datepart(MINUTE, F1) BETWEEN "30" AND "59" ');


кто нить сможет сказать? как правильно? Спасиб.

Автор: djmix777 30.11.2014, 16:18
ещё один файлик с последней ошибкой с последнего кода

Автор: djmix777 30.11.2014, 16:19
вот примерн то что представляет из  себя таблица, я фильтрую по человеку поле F2 и хочу научиться фильтровать по полю F1


Автор: Misha_White 1.12.2014, 04:49
В Oracle  например:
Код

SELECT F1
FROM table1
WHERE
F1=TO_DATETIME(p_date, 'DD.MM.YYYY HH24:MI:SS')


p_date IN VARCHAR2

Автор: superVad 4.12.2014, 23:55
djmix777, если не хочется морочиться с форматом, то может лучше использовать параметры?
Ну или документацию к СУБД почитать.

Автор: Misha_White 5.12.2014, 07:43
Цитата(djmix777 @ 30.11.2014,  23:11)
думал что то типа этого
Код

Adoquery1.sql.add('select F1,F2,F3,F4,F5,F6 from worktime.csv ');
              Adoquery1.sql.add( ' where F1>=''18.11.2014 17:30:00'' ');
              Adoquery1.sql.add( 'AND F2=' + label9.Caption+' ');
              Adoquery1.sql.add('group by F1,F2,F3,F4,F5,F6' );
              Adoquery1.active := true;

У него из csv данные тянутся. Хз, таким не занимался извратом.
Вот несколько мыслей.

У тебя тут дата в двойном апострофе, а не в кавычках.
Так попробуй.
Код

Adoquery1.sql.add('select F1,F2,F3,F4,F5,F6 from worktime.csv ');
              Adoquery1.sql.add( ' where F1>="18.11.2014 17:30:00" ');
              Adoquery1.sql.add( 'AND F2=' + label9.Caption+' ');
              Adoquery1.sql.add('group by F1,F2,F3,F4,F5,F6' );
              Adoquery1.active := true;


Ну и еще, попробуй в среде разрнаботки вбить полностью запрос в ADOQuery.SQL, а затем Active перевести в True.
Думаю поймёшь где косяк.

Еще один варинат. Вместо '+EditText.Text+' Использовать '+DateTimeToStr(DateTimePicker.DateTime)+'

Автор: AndreyZ53 5.12.2014, 09:59
Попробуйте так 

'...F1>='+''''+'19.01.2014'+''''....

Должно прокатить

Автор: baldina 5.12.2014, 10:39
гадаете на кофейной гуще...
1. форматы даты/времени: https://ru.wikipedia.org/wiki/ISO_8601
2. покажите схему (содержимое Schema.ini)



Автор: djmix777 12.12.2014, 15:08
Уважаемые формучане))  smile   Спасиб что обсуждаете) я чесн слово не думал что обсуждение будет ещё. сегодня вечером погляжу, попробую вышесказанное, и отвечу некоторым товарищам!! 

Автор: djmix777 13.12.2014, 22:58
Цитата(baldina @ 5.12.2014,  10:39)
гадаете на кофейной гуще...
1. форматы даты/времени: https://ru.wikipedia.org/wiki/ISO_8601
2. покажите схему (содержимое Schema.ini)

Код

[worktime.csv]
ColNameHeader=False
Format=Delimited(;)

Автор: baldina 13.12.2014, 23:48
http://msdn.microsoft.com/en-us/library/ms709353(v=vs.85).aspx

Автор: superVad 14.12.2014, 17:09
Т.е. вариант, использовать параметры не подошел?

Автор: djmix777 15.12.2014, 18:08
Цитата(superVad @ 14.12.2014,  17:09)
Т.е. вариант, использовать параметры не подошел?

в связи с тем что пример с параметрами не видал, можете подкинуть мыслю? Спасибо. остальное всё перепробовал. 

p.s. про схему ини ещё не поборол

Автор: superVad 15.12.2014, 23:20
Цитата(djmix777 @  15.12.2014,  17:08 Найти цитируемый пост)
в связи с тем что пример с параметрами не видал, можете подкинуть мыслю? Спасибо. остальное всё перепробовал. 

Как то так, но лучше погуглить: делфи запросы с параметрами или ADO Parameters.
Код

  ADOQuery1.SQL.Text :=
    'select F1, F2, F3, F4, F5, F6' + sLineBreak +
    'from worktime.csv' + sLineBreak +
    'where F1 >= :F1 AND F2 = :F2' + sLineBreak +
    'group by F1, F2, F3, F4, F5, F6';
  ADOQuery1.Parameters.ParamValues['F1'] := EncodeDate(2014, 11, 18) + EncodeTime(17, 30, 0, 0);
  ADOQuery1.Parameters.ParamValues['F2'] := Label9.Caption;

Можно так присваивать если юзать DateTimePicker:
Код

  ADOQuery1.Parameters.ParamValues['F1'] := DateTimePicker1.DateTime;

Автор: salik 6.2.2015, 12:22
Для начала надо грамотно составить запрос.
Например:
Код

select cast(F1 as datetime) F1 from worktime.csv 
where F1 between STR_TO_DATE(:in_d1, '%d.%m.%Y %H:%i:%s') and STR_TO_DATE(:in_d2, '%d.%m.%Y %H:%i:%s');

Приведение полей к нужным типам позволит рационально использовать индексы, если конично они у вас есть.
Если человек в предыдущем посте правильно обращается к параметрам, тогда:
Код

ADOQuery1.Parameters.ParamValues['in_d1'] := '11.11.2000 00:00:00';
ADOQuery1.Parameters.ParamValues['in_d2'] :='11.11.2050 23:59:59';

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)