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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2007, 07:06   #1
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию Агрегатная функция SUM для DateTime

Для поля DateTime не работает агрегатная функция SUM(....).
Не могу врубиться почему...
Ведь DateTime по своей сущности является дробным числом.
А циклично сложить дату-время в таблице можно.
Попробую "на пальцах" изложить суть проблемы пока без таблицы...
Нужно посчитать время пребывания человека на работе. Итак...
Код:
var prihod1, prihod2, prihod3, uhod1, uhod2,
uhod3, minuta, itog1, itog2: TDateTime;

...

   minuta := EncodeTime(0, 0, 0, 0);
   {Приход и уход первый раз}
   prihod1 := StrToDateTime('27.09.2007 16:00:00');
   uhod1 := StrToDateTime('27.09.2007 17:00:00');

   {Приход и уход второй раз}
   prihod2 := StrToDateTime('27.09.2007 18:00:00');
   uhod2 := StrToDateTime('27.09.2007 19:00:00');

   {Приход и уход третий раз}
   prihod3 := StrToDateTime('27.09.2007 20:00:00');
   uhod3 := StrToDateTime('27.09.2007 21:00:00');

   {Как видим, человек был на работе три раза по одному часу, т.е. три часа}
   {Считаем...
   Вариант 1 - сумма разниц между уходами и приходами}
   itog1 := (uhod1 - prihod1) + (uhod2 - prihod2) + (uhod3 - prihod3);
   memo.Lines.Add(TimeToStr(itog1 + itog1 * minuta));

   {Вариант 2 - сумма всех уходов минус сумма всех приходов}
   itog2 := (uhod1 + uhod2 + uhod3) - (prihod1 + prihod2 + prihod3);
   memo.Lines.Add(TimeToStr(itog2 + itog2 * minuta));
В обоих случаях результат правильный (3:00:00), т.е. три часа.
Таким образом, можно взять сумму всех уходов минус сумму всех приходов.
Но суммировать данные таблицы циклом - это идиотизм.
При вызове запроса SELECT SUM(aDATETIME) FROM.... сразу вылетает ошибка
"Нет числового аргумента для числового оператора SUM".
Написание чего-то типа SELECT SUM(aDATETIME) AS "DOUBLE" FROM.... результата не даёт.
Вопрос: как правильно взять сумму даты-времени одним запросом?
Буду рад любой инфе. Вторые сутки мучаюсь...
_SERGEYX_ вне форума Ответить с цитированием
Старый 28.09.2007, 08:42   #2
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Вот что по этому поводу написано в книге Аллен Дж. Тейлор "SQL для чайников" (описан стандарт SQL:1999):

Цитата:
Интервальные выражения со значением

Если взять два значения даты-времени и от одного из них отнять другое, то получится интервал. Но сложение таких значений друг с другом не имеет смысла, поэтому SQL эту операцию не поддерживает. Если же сложить друг с другом два интервала или вычесть один из другого, то в результате снова получится интервал. Кроме того, интервал можно умножать или делить на числовую константу.

Вспомните, что в SQL имеется два типа интервалов: год-месяц и день-время. Чтобы избежать двусмысленности, необходимо в интервальном выражении со значением указывать, какой из этих типов в нем используется. Например, в следующем выражении вычисляется интервал в годах и месяцах от текущей даты до дня, когда вы достигнете пенсионного возраста (60 лет):

(BIRTHDAY_60 - CURRENT_DATE) YEAR TO MONTH

А это возвращает интервал в 40 дней:

INTERVAL '17' DAY + INTERVAL ' 2 3' DAY

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

INTERVAL '9' MONTH * 5

Интервалы могут быть как положительные, так и отрицательные, и могут состоять из любого выражения со значением или комбинации таких выражений, значением которой является интервал.



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

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Старый 28.09.2007, 10:06   #3
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

SELECT FROM_DAYS(SUM(TO_DAYS(Твое поле))) FROM tbl_name;
Но результат будет в Грегорианском календаре по идее FROM_DAYS должно преобразовать дату, но оно что-то не так преобразовует...
Григорианский календарь - єто число дней с 1 января 4712 года до нашей єрі и указанной датой....

а вот для времени:
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(столбец времени))) FROM Тфблица;
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp

Последний раз редактировалось Pitbull; 28.09.2007 в 10:55.
Pitbull вне форума Ответить с цитированием
Старый 28.09.2007, 16:16   #4
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Что-то SELECT SEC_TO_TIME не прокатывает.
Ну, лан... Что-нибудь придумаю. Всем Спасибо.
_SERGEYX_ вне форума Ответить с цитированием
Старый 28.09.2007, 16:21   #5
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

Цитата:
Сообщение от _SERGEYX_ Посмотреть сообщение
Что-то SELECT SEC_TO_TIME не прокатывает.
Ну, лан... Что-нибудь придумаю. Всем Спасибо.
mySql у меня..Все катит...
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp
Pitbull вне форума Ответить с цитированием
Старый 28.09.2007, 16:24   #6
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Я юзаю Absolute Database. Наверно, поэтому...
_SERGEYX_ вне форума Ответить с цитированием
Старый 09.02.2009, 12:40   #7
beso
Пользователь
 
Регистрация: 02.04.2007
Сообщений: 37
По умолчанию _SERGEYX_

ne kto ne daiot kod ili instrukcia takova vaprosu u menia toje nujna etat tema http://programmersforum.ru/showthrea...438#post197438 daiu vapros i ne koto ne otvechait. a sevodnia nashol книги Понимание SQL chitaiu i skora budu sam razbiratsa. dumaiu shto tebe toje pamojet _SERGEYX_
Вложения
Тип файла: rar книги Понимание SQL.rar (243.9 Кб, 30 просмотров)
beso вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция ZiLi Microsoft Office Excel 1 05.09.2008 18:37
Hex в DateTime и обратно yurban Общие вопросы Delphi 1 30.08.2008 09:06
функция sergei64_89 Общие вопросы C/C++ 2 25.05.2008 16:48
DATETime XPAiN БД в Delphi 12 15.11.2007 13:37
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50