Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать фильтрацию по дате


Страницы:   1 2

Riva4 ©   (2006-02-27 17:23:00) 

Есть база с полем Дата есно в формате DateTime и есть DataTimePicker. Как сделать выборку по дате через DataTimePicker?


paul_k   (2006-02-28 12:56:00) [1]

varchar - тип данных. подробнее - QueryAnalizer F1 varchar
3- формат даты dd/mm/gg
подробнее о форматах конвертации даты QueryAnalizer F1 convert


Nikolay M.   (2006-02-28 11:39:00) [2]


> Если по дате надо искать то она уже при вставке прогоняется
> через 3-й формат

Ну не всегда же время можно отбросить :(


> почему varchar и что такое 3

http://www.sql.ru/faq/faq_topic.aspx?fid=110


Riva4   (2006-02-28 11:16:00) [3]

ПАсиба всем - все работает, тока был бы презнателен если кто-нить пояснит, что значат эти параметры

(datetime, convert(varchar,YOR_DATE_PARAM,3),3)

ну datetime и convert понятно, а почему varcharи что такое 3?


paul_k   (2006-02-28 10:46:00) [4]

> В таком виде индекс на поле не будет использоваться

естественно. Но пока я встречал другой вариант. Если по дате надо искать то она уже при вставке прогоняется через 3-й формат, чтоб времени там и в помине не было. Как результат - в запросе его отсекать у поля не надо, следовательно и скорость работы завпроса выше и индекс если есть то используется.

Но, это уже проектировать базу надо:)


Nikolay M.   (2006-02-28 10:12:00) [5]


> paul_k ©   (28.02.06 09:12) [15]
> для выборки на дату
> select field1,...,fieldN
> from table
> WHERE CONVERT(datetime, convert(varchar,YOR_DATE_FIELD,3),
> 3)= CONVERT(datetime, convert(varchar,YOR_DATE_PARAM,3),
> 3)


В таком виде индекс на поле не будет использоваться. Конечно, если индекса нет, тогда без разницы. Еще вариант, выглядит менее громоздко:
WHERE DATEDIFF (day, FIELD, PARAM) = 0.

Но поскольку одна дата - это частный случай временного интервала, лучше всегда пользоваться твоим вторым вариантом (для периода).


paul_k   (2006-02-28 09:14:00) [6]

прошу пардону в строке
AND YOR_DATE_FIELD < CONVERT(datetime,convert(varchar, DATEADD(dd,1,YOR_DATE_PARAM_START), 3),3)
читать YOR_DATE_PARAM_END


paul_k   (2006-02-28 09:12:00) [7]

Ты передаешь дату со временем. Сервер вероятнее всего хранит тоже со временем.
небольшое прреобразование помогавет это обойти
для выборки на дату
select field1,...,fieldN
from table
WHERE CONVERT(datetime, convert(varchar,YOR_DATE_FIELD,3),3)= CONVERT(datetime, convert(varchar,YOR_DATE_PARAM,3),3)

Для периода
WHERE YOR_DATE_FIELD >= CONVERT(datetime,convert(varchar, YOR_DATE_PARAM_START, 3),3)
AND YOR_DATE_FIELD < CONVERT(datetime,convert(varchar, DATEADD(dd,1,YOR_DATE_PARAM_START), 3),3)

вместо преобразования параметра для отсечения времени в запросе можно передавать  не sDataTimePicker.DateTime (дата и время) а sDataTimePicker.Date (только дата)


Anatoly Podgoretsky   (2006-02-27 19:44:00) [8]

Riva4   (27.02.06 18:06) [13]
в MSSQL хранятся данные в формате  DateTime


Riva4   (2006-02-27 18:06:00) [9]

Не а... не помогло. Может это из-за того как в MSSQL хранятся данные
(в формате  27фев2006?)


stone   (2006-02-27 17:55:00) [10]

нет. если у тебя хранится только дата (время равно 0:00:00), то
tblIndustry.Parameters.ParamByName('Str2').Value := trunc(sDataTimePicker.DateTime);


Riva4   (2006-02-27 17:52:00) [11]

//А как мне тогда енто победить?

tblIndustry.SQL.Add('SELECT *');
tblIndustry.SQL.Add('FROM books');
tblIndustry.SQL.Add('WHERE DateTime=:Str2+%');
tblIndustry.Parameters.ParamByName('Str2').Value:=sDataTimePicker.DateTime;

так прокатит?


Riva4   (2006-02-27 17:50:00) [12]

tblIndustry.SQL.Add('SELECT *');
tblIndustry.SQL.Add('FROM books');
tblIndustry.SQL.Add('WHERE DateTime=:Str2');
tblIndustry.Parameters.ParamByName('Str2').Value:=sDataTimePicker.DateTime;


stone   (2006-02-27 17:50:00) [13]

Не забудь, что формат DateTime содержит не только дату, но и время. Поэтому, если дата совпадет, а время нет, рекордсет будет пустой.


Riva4   (2006-02-27 17:48:00) [14]


Зачем в апострофы взял?

не это опечатка


Riva4   (2006-02-27 17:46:00) [15]

//ну и так тоже

tblIndustry.SQL.Add('SELECT *');
tblIndustry.SQL.Add('FROM books');
tblIndustry.SQL.Add('WHERE DateTime=:Str2');
tblIndustry.Parameters.ParamByName('Str2').Value:='sDataTimePicker.DateTime';

//и вот так

fmMain.tblIndustry.Filtered:=true;
fmMain.tblIndustry.Filter:= 'DataTime='''+sDataTimePicker.DateTime+'''';


stone   (2006-02-27 17:46:00) [16]


> 'sDataTimePicker.DateTime';

Зачем в апострофы взял?


Riva4   (2006-02-27 17:44:00) [17]

Удалено модератором


Riva4   (2006-02-27 17:42:00) [18]

Забыл добавить база MSSQL
запрос такого вида

tblIndustry.SQL.Add('SELECT *');
tblIndustry.SQL.Add('FROM books');
tblIndustry.SQL.Add('WHERE DateTime LIKE :Str2');
tblIndustry.Parameters.ParamByName(Str2'').Value:='sDataTimePicker.DateTime';


stone   (2006-02-27 17:39:00) [19]

Какая СУБД?
Покажи что уже делал.


Riva4   (2006-02-27 17:37:00) [20]

Да это я ужо делал , тока он ничего не выбирает :(


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо