Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2007, 19:47   #1
ГОСЕАН
Форумчанин
 
Аватар для ГОСЕАН
 
Регистрация: 03.05.2007
Сообщений: 247
По умолчанию интересная задача про DataTimePicker

помогите решить задачу.
1- на форме находится DataTimePicker, из которого пользователь выбирает необходимую дату. (условие привязана к dakta:DateTime)
Надо: На выбранную дату выбрать данные после 8 утра и подсчитать записи + следующую дату до 8 утра тоже подсчитать и суммировать, или промежуток от выбранной даты + следующей даты от 8 до 8 утра подсчитать количество записей.

как это сделать?
ГОСЕАН вне форума Ответить с цитированием
Старый 12.07.2007, 11:19   #2
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Код:
procedure TForm1.DateTimePickerClick(Sender: TObject);
var aSumma: Double;
   aCount: Integer;
begin
   Query.Close;
   Query.SQL.Clear;
   Query.SQL.Add('Select SUM(MyField) from MyTable where (DATA >= "' + datetostr(DateTimePicker.Date) + '") and (TIME >= "08:00") and (DATA <= "' + datetostr(DateTimePicker.Date + 1)...........и так далее...думаю, знаешь как написать sql - запрос, я же не знаю какие там поля.........
   Query.Open;
   aSumma := Query.fields[0].asfloat;
   aCount := Query.RecordCount;
end;
_SERGEYX_ вне форума Ответить с цитированием
Старый 12.07.2007, 12:42   #3
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

xxx mn_fuzka xxx
Цитата:
Сообщение от ГОСЕАН Посмотреть сообщение
помогите решить задачу.
1- на форме находится DataTimePicker, из которого пользователь выбирает необходимую дату. (условие привязана к dakta:DateTime)
Надо: На выбранную дату выбрать данные после 8 утра и подсчитать записи + следующую дату до 8 утра тоже подсчитать и суммировать, или промежуток от выбранной даты + следующей даты от 8 до 8 утра подсчитать количество записей.

как это сделать?
Можно восспользоваться оператором Between, но я не знаю как там прилепить время.....Может, так...Но я не за компом...Точно не могу сказать.... Выше описанный пример работает.... Но если по-другому, то возможно так.... Но насчет Времени я не знаю будет ли оно так его хавать....

begin
Query.Close;
Query.SQL.Clear;
Query.SQL.Add('Select * from MyTable');
Query.SQL.Add('where data between date( 1) and date( 2) and Time(:v1)>'8:00' and Time(:v2)<'8:00'.....);
Query.Parametrs[0].value:=DateTimePicker1.date;
Query.Parametrs[1].value:=DateTimePicker2.Date;
Query.Parametrs[2].value:=DateTimePicker2.Time;
Query.Parametrs[3.value:=DateTimePicker2.Time;
Query.ExecSQL;
aCount := Query.RecordCount;
end;




xx mn_fuzka xx
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp

Последний раз редактировалось Pitbull; 12.07.2007 в 14:24.
Pitbull вне форума Ответить с цитированием
Старый 12.07.2007, 12:52   #4
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Цитата:
Сообщение от ГОСЕАН Посмотреть сообщение
помогите решить задачу.
1- на форме находится DataTimePicker, из которого пользователь выбирает необходимую дату. (условие привязана к dakta:DateTime)
Надо: На выбранную дату выбрать данные после 8 утра и подсчитать записи + следующую дату до 8 утра тоже подсчитать и суммировать, или промежуток от выбранной даты + следующей даты от 8 до 8 утра подсчитать количество записей.

как это сделать?
Сначала немного теории. Фрагмент описания типа DateTime из Delphi7 Help:

Код:
 
TDateTime представляет значение даты-и-времени в Delphi.
 
Unit
System
 
Синтаксис Delphi:
 
type TDateTime = type Double;
 
Описание
 
Большинство CLX объектов представляют значения даты и времени, используя значение TDateTime. В Delphi, TDateTime представлен действительным числом двойной точности (тип Double). 
 
Целая часть значения Delphi TDateTime - соответствует числу дней прошедших с 12/30/1899. Дробная часть значения TDateTime- это прошедшая часть из 24-часового промежутка суток. ...
Выводы: раз DateTime - действительные числа, значит с ними возможны соответствующие операции типа сложения, вычитания, деления, умножения. Правда существуют некоторые тонкости, о которых ты можешь прочитать в хелпе на TDateTime.

А сейчас конкретное применение полученной информации непосредственно к твоей задаче. Составляем запрос на выборку:

SELECT ... FROM ...
WHERE (dakta>='20.01.2007'+8/24) AND (dakta<'20.01.2007'+8/24+1)

, где
'20.01.2007' - значение чистой даты из DateTimePicker оно будет трактоваться как '20.01.2007 00:00:00';
8/24 - 8 часов из 24-часового промежутка суток;
1 - это 1 сутки или 24 часа.

тогда выражение '20.01.2007'+8/24 будет трактоваться как '20.01.2007 08:00:00', а выражение '20.01.2007'+8/24+1 будет уже '21.01.2007 08:00:00'

Вот собственно и все.

----------

PS: В книге Аллен Дж. Тейлор "SQL для чайников", опирающейся на стандарт SQL:1999, написано буквально следующее:

Код:
 
Выражения со значением даты-времени выполняют операции с
 данными, относящимися к дате ивремени. Компоненты этих выражений могут иметь типы данных DATE, TIME, TIMESTAMP и INTERVAL. 
Результат выполнения выражения со значением даты-времени всегда относится к одному из типов даты-времени (DATE, TIME или 
TIMESTAMP). Например, следующее выражение дает дату, которая 
наступит ровно через неделю:
 
 
CURRENT_DATE + INTERVAL '7' DAY
Однако выражение

select * from 'mdatt.db' where (mdatt>='20.01.2007') and (mdatt<='20.01.2007' + interval '1' day)

в TQuery SQL выдает ошибку:

Invalid use of keyword.
Token1: '1')
Line Number: 1

Может кто скажет где грабли?
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.

Последний раз редактировалось Andrei; 12.07.2007 в 13:09.
Andrei вне форума Ответить с цитированием
Старый 12.07.2007, 13:02   #5
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

xxx mn_fuzka xxxтеория вреная.... Советую использовать Between(Если я правильно написал)Синтаксис следующий:
....Where data between Интервал1 and интервал2

В твоем случае не написано поле типа Date ...попробуй добавить поле Datt типа date и потом так:

select * from 'mdatt.db' where (datt>='20.01.2007') and (datt<='20.01.2007' + interval '1' day)


Просто в твоем случае имя поля совпадает с именем таблицы... Может, из-за этого и запарка..... А та х.з....Синтаксис правильный....
Если ты будешь использховать MySQL, то там нужно немного не так дату писать: 2007-01-20......
А вообще DateTimePicker1.Date + 1 ; // и даст тебе на 1 день больше...
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp

Последний раз редактировалось Pitbull; 12.07.2007 в 14:29.
Pitbull вне форума Ответить с цитированием
Старый 13.07.2007, 17:10   #6
ГОСЕАН
Форумчанин
 
Аватар для ГОСЕАН
 
Регистрация: 03.05.2007
Сообщений: 247
По умолчанию

Цитата:
Сообщение от _SERGEYX_ Посмотреть сообщение
Код:
procedure TForm1.DateTimePickerClick(Sender: TObject);
var aSumma: Double;
   aCount: Integer;
begin
   Query.Close;
   Query.SQL.Clear;
   Query.SQL.Add('Select SUM(MyField) from MyTable where (DATA >= "' + datetostr(DateTimePicker.Date) + '") and (TIME >= "08:00") and (DATA <= "' + datetostr(DateTimePicker.Date + 1)...........и так далее...думаю, знаешь как написать sql - запрос, я же не знаю какие там поля.........
   Query.Open;
   aSumma := Query.fields[0].asfloat;
   aCount := Query.RecordCount;
end;
Спасибо за помощь.
ГОСЕАН вне форума Ответить с цитированием
Старый 14.07.2007, 20:45   #7
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

Цитата:
Сообщение от ГОСЕАН Посмотреть сообщение
Спасибо за помощь.
А мой запрос тоже работает.. Я пробовал дома
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp
Pitbull вне форума Ответить с цитированием
Старый 15.07.2007, 10:35   #8
ГОСЕАН
Форумчанин
 
Аватар для ГОСЕАН
 
Регистрация: 03.05.2007
Сообщений: 247
По умолчанию

Цитата:
Сообщение от Pitbull Посмотреть сообщение
А мой запрос тоже работает.. Я пробовал дома
Ваш я тоже пробовал, но ODBC не распознал или не хочет распознать.
ГОСЕАН вне форума Ответить с цитированием
Старый 15.07.2007, 16:37   #9
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

Цитата:
Сообщение от ГОСЕАН Посмотреть сообщение
Ваш я тоже пробовал, но ODBC не распознал или не хочет распознать.

тю.... У меня MySQL 5.0 и ODBC 3. - все работает....
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp
Pitbull вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Занесение значения DataTimePicker в базу inret Общие вопросы Delphi 3 09.05.2008 15:21
Интересная задача. Нужны идеи ее решения KnDmPetr Паскаль, Turbo Pascal, PascalABC.NET 11 05.03.2008 18:43
Интересная задача Ser Паскаль, Turbo Pascal, PascalABC.NET 3 27.02.2008 00:19
Интересная задача(MediaPlayer) PilGrim Компоненты Delphi 3 03.12.2007 08:46