Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,211

Фильтрация по дате и времени

18.12.2013, 18:38. Показов 2791. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Скорее всего это продолжение темы “Условие сравнения текущей даты с датой указанной в таблице, что не так? ”.

Создана таблица так:
……………………………
C++
1
ADOQuery1->SQL->Add("CREATE TABLE  MyTab  (Узел Integer, Дата_время DateTime, "+"Измерение Float, Cостояние String (20))");
(Русские названия столбцов, чтобы было понятно в Access, но в данном случае это не принципиально.)
……………………………
Необходимо из неё “вытащить” записи cделанные после заданного времени (в принципе задача сложнее, но у меня не получается фильтрация по времени и дате):

C++
1
2
3
4
5
6
WideString W;
TDateTime T0;
//...
W="SELECT * FROM  MyTab  WHERE  Дата_время >="+T0.DateTimeString();
ADOQuery2->SQL->Add(W);
//...
Пробовал так:
C++
1
W="SELECT * FROM  MyTab  WHERE  Дата_время >="+T0;
Даже так:
C++
1
W="SELECT * FROM  MyTab  WHERE  Дата_время >= 17.12.2013 22:12:20";
При отправке запроса “ругается” – то непонятные данные, то не полные.

На форумах по Delphi нашёл, что надо заменить тип данных столбца TDateTime на String и осуществлять поиск, сравнивая строки, а не DateTime. Но тогда 18.12.2000 22:12:20 и другие даты, начинающиеся с числа выше 17 будут так же удовлетворять условиям фильтрации. Да и вообще интересно разобраться.

Подскажите, как поступить.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.12.2013, 18:38
Ответы с готовыми решениями:

Алгоритм расчёта времени поезда в пути по дате и собственно времени(отправления и прибытия)
Всем доброго времени суток. Помогите пожалуйста написать алгоритм расчёта времени поезда в пути, если известны время и дата...

Фильтрация по дате
Помогите! мне нужно отфильтровать базу (за последний месяц) по полю в котором хранится дата и произвести суммирование значений в другом...

Фильтрация по дате
Добрый вечер, нужна помощь такого рода. Создала программу, которая работает с бд access. В базе вводится ФИО преподов, стаж работы, научная...

8
 Аватар для helsik
12 / 12 / 3
Регистрация: 09.12.2013
Сообщений: 142
18.12.2013, 21:59
myFunction{а вот тут уже обозначте откуда берете данные, и чтоб формат был 17.12.2013 22:12:20}
запрос:
SELECT MyTab.[Дата_время] FROM MyTab WHERE (((MyTab.[Дата_время])<=myFunction()));

возможно в чем-то неправ, подправьте если что, это мое ИМХО))

Добавлено через 15 минут
Цитата Сообщение от helsik Посмотреть сообщение
чтоб формат был 17.12.2013 22:12:20
кажись в FormatString можно задать, чтоб не было
Цитата Сообщение от shyub Посмотреть сообщение
то непонятные данные, то не полные
1
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,211
18.12.2013, 22:04  [ТС]
Первоначально данные вводил через Edit-ы и преобразовывал в формат TDateTime. Пробовал данные брать из DateTimePicker, а затем даже:

T0=Now()-10;

Просмотрел советы с других форумов, вот что-то обещающее, но :
- второй раз без перезагрузки программы не работает.
- фильтрует только по дате, а надо и по дате и по времени.

C++
1
2
3
ADOQuery2->Parameters->ParamByName("D1")->Value =FormatDateTime("DD.MM.YYYY",DateTimePicker1->Date);
ADOQuery2->Parameters->ParamByName("D2")->Value = FormatDateTime("DD.MM.YYYY",DateTimePicker2->Date);
W="SELECT * FROM MyTab WHERE (Дата_время >= :D1 and Дата_время<= :D2)";
Вот ещё не работающий вариант:

C++
1
2
3
4
T0=Now()-10;
T1=Now();
W="SELECT * FROM MyTab WHERE Дата_время >= DateValue(" + FormatDateTime("dd/mm/yyyy hh:mm:ss",T0) +
        ") AND Дата_время <= DateValue(" + FormatDateTime("dd/mm/yyyy hh:mm:ss",T1) + ")"
Пока проблему не решил.
0
 Аватар для helsik
12 / 12 / 3
Регистрация: 09.12.2013
Сообщений: 142
18.12.2013, 22:40
TDateTime datetime = ...;
datetime += 1.0 / 24; // сдвигаем на час вперед
datetime -= 1.0; // сдвигам на день назад
datetime += 7.0; // сдвигаем на неделю вперед
datetime = IncMonth( datetime, -1 ); // сдвигаем на месяц назад

TDateTime - по сути всего лишь число с плавающей точкой двойной точности, со всеми вытекающими последствиями. То есть , например, для того, чтобы вычислить разницу между двумя датами, достаточно вычесть одно из другого:

TDateTime datetime1 = ...;
TDateTime datetime2 = ...;
double difference = (double)( datetime2 - datetime1 );

Цитата Сообщение от shyub Посмотреть сообщение
Первоначально данные вводил через Edit-ы и преобразовывал в формат TDateTime
можно увидеть код?
1
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,211
18.12.2013, 23:17  [ТС]
Это понятно, просто чтобы не усложнять код при эксперементах я вручную изменял T0 и T1.
Проблема в том, что в таблицу дата и время заносятся в формате TDateTime, а напрямую в SQL-фильтре "WHERE" я не могу указать величину в этом формате. Если бы изменить тип столбеца с TDateTime на double, то наверняка всё заработало бы прекрасно, но тогда при выводе в DBGrid придётся "химичеть", а это будет тормозить открытие базы, да и в Access будет чёрт знает что вместо времени.

Добавлено через 8 минут
Извиняюсь, забыл. Вот отрывок из кода.
Это работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//---------------------------------------------------------------------------
// Показать только записи с прикреплёнными сообщениями.
void __fastcall TForm1::Button9Click(TObject *Sender)
{
    WideString dbFile;
    WideString W;
    dbFile=ExtractFilePath(Application->ExeName)+"Data\\"+Edit1->Text+".mdb";
    ADOQuery2->SQL->Clear();
    ADOQuery2->ConnectionString=WideString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+dbFile+
            ";Persist Security Info=False; Jet OLEDB:Database Password="+Edit2->Text+";"); // Соединение с базой данных.
    W="SELECT * FROM "+Edit3->Text+" WHERE Cостояние >\"\" ";  // Показать данные только c сообщениями.      */
    ADOQuery2->SQL->Add(W);
    try
    {
        ADOQuery2->Open();  // Выполнение команды.
    }
    catch(...)
    {
        ShowMessage("Ошибка при запросе данных");
    }
}
//---------------------------------------------------------------------------
Здесь необходимо осуществлять вывод данных от указываемого в Edit-е узла за требуемый промежуток времени.
Эта часть пока не работает.
//---------------------------------------------------------------------------
void __fastcall TForm1::Button10Click(TObject *Sender)
{
    WideString W, A;
    WideString dbFile;  //
    TDateTime T0; // Определение первой составляющей даты и времени (начало).
    TDateTime T1; // Определение первой составляющей даты и времени (конец).
    if(Edit5->Text==NULL)
    {
        ShowMessage("Не указаны номер узла.");
        return;
    }
    dbFile=ExtractFilePath(Application->ExeName)+"Data\\"+Edit1->Text+".mdb";
    ADOQuery2->SQL->Clear();
    ADOQuery2->ConnectionString = WideString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+dbFile+
            ";Persist Security Info=False; Jet OLEDB:Database Password="+Edit2->Text+";"); // Соединение с базой данных.
 
//  W="SELECT * FROM "+Edit3->Text+" WHERE [Дата_время] >=\""+T0.DateTimeString()+"\"";
//  ADOQuery2->Parameters->ParamByName("D1")->Value = FormatDateTime("DD.MM.YYYY",DateTimePicker1->Date);
//  ADOQuery2->Parameters->ParamByName("D2")->Value = FormatDateTime("DD.MM.YYYY",DateTimePicker2->Date);
//  W="SELECT * FROM "+Edit3->Text+" WHERE (Узел="+Edit5->Text+" and Дата_время >= :D1 and Дата_время<= :D2)";
// W="SELECT * FROM "+Edit3->Text+" WHERE (Узел="+Edit5->Text+" and Дата_время >="+DateTimePicker1->Date+" and Дата_время<= "+DateTimePicker2->Date+")";
 
T0=Now()-10;
T1=Now();
/*ADOQuery2->Parameters->ParamByName("StartDate")-        //->AsDateTime = T0;
ADOQuery2->Parameters->ParamByName("StartEnd")->AsDateTime = T1;
W="SELECT * FROM "+Edit3->Text+" WHERE (aDate >= :StartDate and aDate <= :EndDate)";   */
 
W="SELECT * FROM "+Edit3->Text+" WHERE Дата_время >= DateValue(" + FormatDateTime("dd/mm/yyyy hh:mm:ss",T0) +
        ") AND Дата_время <= DateValue(" + FormatDateTime("dd/mm/yyyy hh:mm:ss",T1) + ")";// ORDER BY Дата_время";
 
    ADOQuery2->SQL->Add(W);
    try
    {
        ADOQuery2->Open();  // Выполнение команды.
    }
    catch(...)
    {
        ShowMessage("Ошибка при запросе данных");
    }
//  ADOQuery2->Close();
}
//---------------------------------------------------------------------------
0
 Аватар для helsik
12 / 12 / 3
Регистрация: 09.12.2013
Сообщений: 142
19.12.2013, 00:41
ot полученная дата с эдита где вводится от какой даты
do соответственно до какой даты вывести записи
и вроде надо юзать .DateTimeString() (он у вас закоментирован T0.DateTimeString())

ADOQuery1->SQL->Text = "select * from таблица where поледатавремя == (ot.DateTimeString() <= do.DateTimeString())";

если вас правильно понял, то по логике запрос должен быть примерно такого вида )
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
19.12.2013, 00:49
Цитата Сообщение от helsik Посмотреть сообщение
==
В первые вижу такой знак в запросе
0
 Аватар для helsik
12 / 12 / 3
Регистрация: 09.12.2013
Сообщений: 142
19.12.2013, 01:09
Цитата Сообщение от Sasha Посмотреть сообщение
В первые вижу такой знак в запросе
да это я уже на автомате.. одно = конечно же:
C++
1
ADOQuery1->SQL->Text = "select * from таблица where поледатавремя = (ot.DateTimeString() <= do.DateTimeString())";
0
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,211
20.12.2013, 14:17  [ТС]
Во-первых спасибо всем, кто хотел оказать помощь в решении данного вопроса.

Задачу удалось решить следующим образом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//---------------------------------------------------------------------------
void __fastcall TForm1::Button10Click(TObject *Sender)
{
    WideString W;
    WideString dbFile;  // Путь и имя файла базы данных.
    TDateTime T0; // Даты и времени начала поиска.
    TDateTime T1; // Дата и время окончания поиска.
    if(Edit5->Text==NULL)
    {
        ShowMessage("Не указаны номер узла.");
        return;
    }
    DateTimePicker1->Time=DateTimePicker2->Time; //Дата и время начала поиска.
    T0 = DateTimePicker1->DateTime-1.15741E-5; // (Минус секунда.)
    DateTimePicker3->Time=DateTimePicker4->Time; //Дата и время окончания поиска.
    T1 = DateTimePicker3->Time+1.15741E-5; // (Плюс секунда.)
    dbFile=ExtractFilePath(Application->ExeName)+"Data\\"+Edit1->Text+".mdb";
    ADOQuery2->SQL->Clear();
    ADOQuery2->ConnectionString = WideString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+dbFile+
            ";Persist Security Info=False; Jet OLEDB:Database Password="+Edit2->Text+";"); // Соединение с базой данных.
    ADOQuery2->Parameters->AddParameter()->Name="D0";
    ADOQuery2->Parameters->AddParameter()->Name="D1";
    ADOQuery2->Parameters->ParamByName("D0")->Value = T0;
    ADOQuery2->Parameters->ParamByName("D1")->Value = T1;
    W = "SELECT * FROM " +Edit3->Text+ " WHERE (Узел = "+Edit5->Text+" and Дата_время >= :D0 and Дата_время <= :D1)";
    ADOQuery2->SQL->Add(W);
    try
    {
        ADOQuery2->Open();  // Выполнение команды.
    }
    catch(...)
    {
        ShowMessage("Ошибка при запросе данных");
    }
}
//---------------------------------------------------------------------------
Визуально в компоненте “ADOQuery2” никакие свойства задавать не надо, они создаются динамически и ADOQuery2->SQL->Clear() – их разрушает.
Ещё хотел бы сказать о компонентах DateTimePicker1-4 (1 и 2 – это дата и время начала поиска, 3 и 4 – соответственно дата и время окончания поиска). Свойство “King” у компонентов работающих с датой установлено в “dtkDate”, со временем – “dtkTime”. Свойство “Time” у компонентов работающих с датой установлено в 0:00:00, а компонентов работающих со временем у DateTimePicker2 - 0:00:01, DateTimePicker4 - 0:00:59. Далее только у DateTimePicker2 и 4 установить свойство “Format=HH:mm” и свойство “Date=0” (появится 30.12.1899).
Здесь надо отметить, что если свойства “Time” будут установлены в 0, то при установке “Date=0” будет возникать ошибка. Далее в тексте программы время начала поиска я уменьшаю чуть больше, чем на секунду (-1.15741E-5), а окончания – увеличиваю, чтобы данные записанные в интервале от 00 до 01 сек при начале поиска и от 59 до 59+0,9999…. сек) попадали в интервал поиска.
К стати, на каком-то форуме по Delphi встречал, что если задать компоненту TDateTimePicker свойство “Format=dd.MM.yyy HH:mm”, то он будет отображать дату и время. Да, отображает, но считать их не удаётся.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.12.2013, 14:17
Помогаю со студенческими работами здесь

Фильтрация по дате
Использую Delphi XE5, FireDAC. Фильтрую значения таблицы при помощи кода Form2.FDQuery1.Active:= False; ...

Фильтрация по дате
Помогите с кодом пожалуйста Вот есть код: procedure TForm1.ButtonClick(Sender: TObject); var data: TDate; begin data...

Фильтрация по дате
Собственно имеется datagridview, которая заполнена различными данными, имеется столбец с датой. На форме имеется datetimepicker, необходимо...

Фильтрация по дате
Здравствуйте, мне необходимо провести фильтрацию из базы по дате. Чтоб если выбираешь 3 разных периода, программа выбирала необходимые...

Фильтрация по дате
Добрый день!У меня проблема с фильтром: Мне нужно отфильтровать значения в поле 'Data-real' по дате меньшей чем текущая!...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 27.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 27.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 27.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 25.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 25.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru