SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.03.2013 11:24:26

Booldog
Участник
Зарегистрирован: 14.03.2013
Сообщений: 6

Вычисление Продолжительности или Длительности события

Добрый день, у меня проблема с вычислением продолжительности некого события. В БД фиксируется и врямя начала и окончания, также дата начала и окончания и даже датавремя начала и окончания. Но когда событие началось допустим сегодня в 23-50-00, а закончилось завтра в 23-44-00 то результат будет неверным...Помогите написать запрос.
Примерный вид БД в прикрепленном файле.


Вычисление продолжительности необходимо производить по двум переменным типа ДатаВремя. (ДатаВремяОкончание-ДатаВремяНачало=резалт). Но так не работает, АДОКвери в Делфи жалуется на непонятный тип данных, всячиские советы на других форумах ни к чему не привели. Может тут помогут.


Прикрепленные файлы:
Attachment Icon Clipboard02.jpg, Размер: 21,388 байт, Скачано: 434

Неактивен

 

#2 14.03.2013 13:36:13

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5833

Re: Вычисление Продолжительности или Длительности события

Неактивен

 

#3 14.03.2013 16:48:42

Booldog
Участник
Зарегистрирован: 14.03.2013
Сообщений: 6

Re: Вычисление Продолжительности или Длительности события

Я так понимаю-юзайте ТИМЕДИФФ и будет счастье?
Если я правильно понял, то так не работает:
ADOQuery1.SQL.Text:='SELECT TIMEDIFF(oks7_sig.Datt_OFF,oks7_sig.Datt_ON) as "Ïðîäîëæèòåëüíîñòü",  ';
пишет
Произошли ошибки во время выполнения многошаговой операции. Проверьте значения всех состояний...
Но пишет так, только в том случае, когда есть разница в ДНЯХ(тоесть в дате).

а вот так работает, но так считает только ДНИ(а мне нужны и дни и время):
ADOQuery1.SQL.Text:='SELECT DATEDIFF(oks7_sig.Datt_OFF,oks7_sig.Datt_ON) as "Ïðîäîëæèòåëüíîñòü",  ';

Неактивен

 

#4 15.03.2013 12:32:39

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Вычисление Продолжительности или Длительности события

Booldog написал:

ADOQuery1.SQL.Text:='SELECT TIMEDIFF(oks7_sig.Datt_OFF,oks7_sig.Datt_ON) as "Ïðîäîëæèòåëüíîñòü",  ';

При корректном формате данных так должно работать.

Распечатайте само значение ADOQuery1.SQL.Text и запустите в консоли mysql. Если не работает то напишите значение тут.

Неактивен

 

#5 15.03.2013 21:45:05

Booldog
Участник
Зарегистрирован: 14.03.2013
Сообщений: 6

Re: Вычисление Продолжительности или Длительности события

я не умею пользоваться консолью MySQL...научите пользоваться или так:

Datt_ON   __________| Dat_ON    | Vremya_ON  |   Datt_OFF   _______| Dat_OFF   | Vremya_OFF
2013-02-01 00:20:40 / 2013-02-01/   00:20:40 / 2013-02-02 00:20:42 / 2013-02-02 /  00:20:42
2013-02-01 00:20:40/ 2013-02-01/    00:20:40 / 2013-02-02 00:20:22 / 2013-02-02 /  00:20:22

Вот тестовый проблемный случай.

Неактивен

 

#6 15.03.2013 22:13:39

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Вычисление Продолжительности или Длительности события

я не умею пользоваться консолью MySQL...научите пользоваться или так:

Ну вы же где то проверяете ваши SQL запросы ? Какой нибудь SQL editor : phpMyAdmin, sqlYog , HeidiSQL, MySQL Workbench ?
Распечатайте саму ADOQuery1.SQL.Text, я думаю там битые данные.
В коде должен генерироваться такой запрос:

SELECT TIMEDIFF('2013-02-01 00:20:40','2013-02-02 00:20:42') as "Ïðîäîëæèòåëüíîñòü"

Неактивен

 

#7 16.03.2013 21:21:45

Booldog
Участник
Зарегистрирован: 14.03.2013
Сообщений: 6

Re: Вычисление Продолжительности или Длительности события

Использую HeidiSQL, я там обычно синтаксис посмотрю и сразу в делфи в АДОКвери и на компиляцию. Обычно культурно ругается-синтаксис и прочее понятные ошибки. Жутчайшее подозрения на несовпадение типов данных.

>>Распечатайте саму ADOQuery1.SQL.Text, я думаю там битые данные.
Простите, я Вас не понял. Вам привести весь запрос?

Неактивен

 

#8 18.03.2013 14:02:37

Booldog
Участник
Зарегистрирован: 14.03.2013
Сообщений: 6

Re: Вычисление Продолжительности или Длительности события

Притом приводить весь код запроса не вижу смысла, так как БЕЗ вот этих двух тестовых значений:
Datt_ON   __________| Dat_ON    | Vremya_ON  |   Datt_OFF   _______| Dat_OFF   | Vremya_OFF
2013-02-01 00:20:40 / 2013-02-01/   00:20:40 / 2013-02-02 00:20:42 / 2013-02-02 /  00:20:42
2013-02-01 00:20:40/ 2013-02-01/    00:20:40 / 2013-02-02 00:20:22 / 2013-02-02 /  00:20:22

ну и им подобных случаев всё работает прекрасно, правда выводит всё это дело в формате ТАЙМ (на сколько я вижу в делфи), то есть формат ответа 00:00:10 (10 секунд).

Можно попробовать так:
ADOQuery1.SQL.Text:='SELECT (oks7_sig.Datt_OFF-oks7_sig.Datt_ON) as "Ïðîäîëæèòåëüíîñòü",  ';
но тогда ответ, это разница в формате INTEGER...например  1000002
дописываем после запроса
TDateField(ADOQuery1.FieldByName('Ïðîäîëæèòåëüíîñòü')).DisplayFormat:='00г-00мес-00дней/00часов-00мин-00сек;
и что получаем:
Datt_ON   __________| Dat_ON    | Vremya_ON  |   Datt_OFF   _______| Dat_OFF   | Vremya_OFF
2013-02-01 00:20:40 / 2013-02-01/   00:20:40 / 2013-02-02 00:20:42 / 2013-02-02 /  00:20:42

ответ: 00г-00мес-01дней/00часов-00-мин-02-сек
Правильно! Но посмотрим второй случай:

Datt_ON   __________| Dat_ON    | Vremya_ON  |   Datt_OFF   _______| Dat_OFF   | Vremya_OFF
2013-02-01 00:20:40/ 2013-02-01/    00:20:40 / 2013-02-02 00:20:22 / 2013-02-02 /  00:20:22
00г-00мес-00дней/99часов-99-мин-82-сек

Какие 99 часов, какие 99 минут, какие 82 секунды?? Все эти завышенные результаты надо минусовать толи на 40, толи на 60 уже непомню...Этот вариант мне тоже не подошел так как на MySQL резать результат посимвольно и анализировать я лично не умею smile А если перекладывать всё это на Делфи-ну это отдельный разговор smile

Вообщем какие еще мысли?

Отредактированно Booldog (18.03.2013 14:04:19)

Неактивен

 

#9 20.03.2013 21:04:53

Booldog
Участник
Зарегистрирован: 14.03.2013
Сообщений: 6

Re: Вычисление Продолжительности или Длительности события

Что всё настолько плохо что и тут помочь не в силах?

Неактивен

 

#10 20.03.2013 23:25:44

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Вычисление Продолжительности или Длительности события

У вас проблема с манипуляциями дат в самом делфи.
Если передадите правильный запрос

SELECT TIMEDIFF('2013-02-01 00:20:40','2013-02-02 00:20:42') as "Ïðîäîëæèòåëüíîñòü"

то получите правильный ответ
-24:00:02

А что у вас там в делфи происходит, извините это не тема этого форума.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson