noname
1

Подсчет времени

03.05.2011, 11:19. Показов 6253. Ответов 31
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Помоги с такой задачкой.
Есть 2 таблицы:Квант времени, Работа.
Поля в таблице Работа: JOB_ID, begin, duration, status_id
Поля в таблице Квант времени: JOB_ID, duration.
Суть проблемы:
нужно сложить поле Квант времени.duration для которых поле Квант времени.JOB_ID=Работа.JOB_ID
при этом если эта сумма равна 0 то нужно найти разницу между Работа.begin и сейчас.
Желательно это все реализовать в виде запроса по таблице Работа.
Помогите пожалуйста.
Заранее спасибо.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2011, 11:19
Ответы с готовыми решениями:

Подсчет времени
Как реализовать операцию, чтобы при открытие формы (файла), регистрировалось текущее время, а в...

Подсчет времени
Необходимо сделать SQL запрос, который будет подсчитывать количество времени, которое: 1) было...

Подсчет времени в поле
Доброго времени суток! Есть поле с полным форматом даты, необходимо посчитать время работы...

Подсчет прошедшего календарного времени и выведение нескольких таблиц в одну форму
Приветствую! Прошу помочь в реализации двух следующих задач. 1). В базе учета одна из таблиц...

31
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
04.05.2011, 08:22 2
Какие типы у полей таблиц и какие значения они содержат?
0
noname
04.05.2011, 09:02 3
Работа.JOB_ID - это счетчик
Работа.status_id - числовой
Квант времени.JOB_ID - числовой(ссылка Работа.JOB_ID)
begin, duration - тип Дата/Время.

с числовыми полями я думаю понятно,
в begin - хранится время начала, duration - продолжительность выполнения.
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
04.05.2011, 11:57 4
Цитата Сообщение от noname Посмотреть сообщение
begin, duration - тип Дата/Время.

с числовыми полями я думаю понятно,
в begin - хранится время начала, duration - продолжительность выполнения.
begin, duration содержат дату+время или только время?
0
noname
04.05.2011, 21:34 5
begin дату+время
duration только время
118 / 118 / 10
Регистрация: 12.05.2010
Сообщений: 1,207
04.05.2011, 23:04 6
Например, так.
0
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
04.05.2011, 23:38 7
noname, потестируйте такой запрос
SQL
1
2
3
4
5
SELECT JOB_ID, INT(dur) & " д. " & Format(dur-INT(dur),"hh:nn:ss") AS Результат
FROM [SELECT R.JOB_ID, 
      IIf(Nz(SUM(K.duration),0)=0, Now()-FIRST(R.begin), SUM(K.duration)) AS dur
      FROM Работа AS R LEFT JOIN Квант_времени AS K ON R.JOB_ID = K.JOB_ID
      GROUP BY R.JOB_ID]. AS Q
Результат выдается в виде Дней часов:минут:секунд.
Возможно вам нужно в запросе не Now()-First(R.begin), а наоборот First(R.begin)-Now().
0
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
04.05.2011, 23:58 8
Вдогонку. Имя таблицы "Квант времени" содержит пробел, который заменен в запросе на знак подчеркивания. Соответственно переименуйте у себя в базе таблицу.
Впредь старайтесь использовать имена таблиц, полей, ... без пробелов, так как пробелы в именах приводят к некоторым осложнениям, в данном случае, при создании запроса.
0
noname
05.05.2011, 13:07 9
Здравствуйте.

Не могли бы вы помочь мне и правильно переделать мой запрос
SQL
1
2
3
4
5
6
7
8
SELECT Работа.JOB_ID, Работа.user_id, Работа.job_name, 
TimeSerial(HOUR(SUM([Квант времени].[duration])),MINUTE(SUM([Квант времени].[duration])),0)+(TimeSerial(0,DateDiff("n",LAST([Квант времени].[begin_time]),TIME()),0)) AS was_time, 
TimeSerial(0,DateDiff("n",TIME(),((LAST([Квант времени].[begin_time]))+[Матрица возможностей].[averagetime])),0) AS [END], 
TIME()+END AS free_time, IIf((free_time)>TimeValue("17:00:00"),0,1) AS free
FROM [Матрица возможностей] INNER JOIN (Работа INNER JOIN [Квант времени] ON Работа.JOB_ID = [Квант времени].JOB_ID) ON ([Матрица возможностей].TYPEJOB_ID = Работа.typejob_id) AND ([Матрица возможностей].USER_ID = Работа.user_id)
GROUP BY Работа.JOB_ID, Работа.user_id, Работа.job_name, [Матрица возможностей].averagetime, Работа.status_id
HAVING (((Работа.status_id)=2 OR (Работа.status_id)=5))
ORDER BY Работа.JOB_ID;
где поля:
"was_time"-поле в котором вычисляется время уже затраченное на работу,
"end"-время которое предполагается еще затратить на выполнения работы
"free"-время которое свободно до конца рабочего дня

"was_time"-вычисляется путем складывания всех записей поля Квант времени.duration для которых поле Квант времени.JOB_ID=Работа.JOB_ID. Само поле Квант времени.duration-это разница между полями end_time и begin_time. Так же в таблице присутствуют записи с частичными данными (есть поля begin_date, begin_time(которые заполняются когда работа выполняется) и поля end_date, end_time(которые заполняются когда работа приостановлена или окончена)), данные о начале работы заполнены, а о окончании нет, для таких полей нужно рассчитать разницу между Time() и последней записью Квант времени.begin_time

"end"-вычисляется путем разницы между Time() и суммой последней записи Квант времени.begin_time и предполагаемым временем окончания (находится путем вычитания из среднего времени выполнения(таблица матрица возможностей и поле averagetime), время которое уже было затрачено на работу)

"free"-находится путем вычисления разницы между "end" и 17:00 вечера

Прилогаю пример данной базы.

Просто очень важно и главное срочно решить эту проблему.

Надеюсь на понимание и содействие.
Заранее спасибо.
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
05.05.2011, 20:24 10
"was_time"-вычисляется путем складывания всех записей поля Квант времени.duration для которых поле Квант времени.JOB_ID=Работа.JOB_ID. Само поле Квант времени.duration-это разница между полями end_time и begin_time.
Зачем держать в таблице Квант времени вычисляемое поле duration?
Почему в разности не учитывается begin_date и end_date? Они что всегда равны? Если да, то зачем держать в таблице обе даты, ведь достаточно одной?
Так же в таблице присутствуют записи с частичными данными (есть поля begin_date, begin_time(которые заполняются когда работа выполняется) и поля end_date, end_time(которые заполняются когда работа приостановлена или окончена)), данные о начале работы заполнены, а о окончании нет, для таких полей нужно рассчитать разницу между Time() и последней записью Квант времени.begin_time.
Что значит "последней записью"? Получается, что для конкретного JOB_ID может быть несколько записей с незаполненными полями end_date, end_time?
"end"-вычисляется путем разницы между Time() и суммой последней записи Квант времени.begin_time и предполагаемым временем окончания (находится путем вычитания из среднего времени выполнения(таблица матрица возможностей и поле averagetime), время которое уже было затрачено на работу)
А если работа уже завершена?
Под последней записью понимается запись с максимальным значением begin_time?
Т.е. схематично end=Time()-(Max(begin_time)+(averagetime-was_time))?
"free"-находится путем вычисления разницы между "end" и 17:00 вечера
Не понял. В запросе у вас считается совсем не так.
А free_time, присутствующее в запросе, считать не надо?

В запросе используется текущее время, так на какой момент времени у вас представлены ожидаемые результаты расчета?
Могут какие-нибудь результаты расчета, особенно подозрительно free, становиться отрицательными?
Могут какие-нибудь результаты расчета быть больше 24 часов? Ведь тогда прийдется задействовать дни.
0
noname
05.05.2011, 21:05 11
Цитата Сообщение от minob Посмотреть сообщение
Зачем держать в таблице Квант времени вычисляемое поле duration?
Почему в разности не учитывается begin_date и end_date? Они что всегда равны? Если да, то зачем держать в таблице обе даты, ведь достаточно одной?
В таблице Квант времени поле duration это разница между begin_data,time и end_date,time
Поля begin_date и end_date в теории всегда должны быть одинаковыми но в реали они редко(но бывает) различаются
Цитата Сообщение от minob Посмотреть сообщение
Что значит "последней записью"? Получается, что для конкретного JOB_ID может быть несколько записей с незаполненными полями end_date, end_time?
Нет, для конкретного JOB_ID может быть только одна запись с пустым значением end_date, end_time, но может быть несколько записей с всеми заполнеными полями таблицы "Квант времени"
Цитата Сообщение от minob Посмотреть сообщение
А если работа уже завершена?
Под последней записью понимается запись с максимальным значением begin_time?
Т.е. схематично end=Time()-(Max(begin_time)+(averagetime-was_time))?
Если работа завершена то она не участвует в данном запросе.
В данном запросе участвуют работы которые имеют статус только 2 или 4
Цитата Сообщение от minob Посмотреть сообщение
Не понял. В запросе у вас считается совсем не так.
А free_time, присутствующее в запросе, считать не надо?
Видимо я не совсем правильно/корректно написал в запросе. Данное поле должно вычисляться путем
нахождения разницы между "end" и 17:00 вечера. Если разница отрицательна то нужно показывать превательно умножив на (-1), если число положительное то нужно показывать "00:00:00"
Цитата Сообщение от minob Посмотреть сообщение
В запросе используется текущее время, так на какой момент времени у вас представлены ожидаемые результаты расчета?
Результаты должны вычисляться на настоящий (на конкретно момент запуска этого отчета пользователем)
Цитата Сообщение от minob Посмотреть сообщение
Могут какие-нибудь результаты расчета, особенно подозрительно free, становиться отрицательными?
Нет не должны, кроме "free"? которое в последующем умножаетс на (-1)
Цитата Сообщение от minob Посмотреть сообщение
Могут какие-нибудь результаты расчета быть больше 24 часов? Ведь тогда прийдется задействовать дни.
Такими могут быть только "was_time" и "end"
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
05.05.2011, 22:50 12
Результаты должны вычисляться на настоящий (на конкретно момент запуска этого отчета пользователем)
Так я и спрашиваю, на какой момент сделан расчет, представленный вами в табличке ожидаемых результатов?
Поля begin_date и end_date в теории всегда должны быть одинаковыми но в реали они редко(но бывает) различаются
Такими могут быть только "was_time" и "end"
Давайте пока отладим запрос, при begin_date = end_date, was_time<=24:00:00, end<=24:00:00, а затем будем выяснять вопросы по исключительным случаям.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
SELECT R.JOB_ID, R.user_id, R.job_name, 
       TimeValue(CDate(SUM(Nz(K.end_time,TIME())- K.begin_time))) AS was_time, 
       TimeValue(CDate(TIME()-MAX(K.begin_time)-M.averagetime+was_time)) AS [END],
       IIf(end>=#17:00:00#,#00:00:00#,#17:00:00#-END) AS free
FROM [Матрица возможности] AS M INNER JOIN 
     (Работа AS R INNER JOIN 
     [Квант времени] AS K 
ON R.JOB_ID = K.JOB_ID) 
ON (M.TYPEJOB_ID = R.typejob_id) AND (M.USER_ID = R.user_id)
WHERE (R.status_id=2) OR (R.status_id=4)
GROUP BY R.JOB_ID, R.user_id, R.job_name, M.averagetime
ORDER BY R.JOB_ID
0
noname
06.05.2011, 00:01 13
Цитата Сообщение от minob Посмотреть сообщение
Так я и спрашиваю, на какой момент сделан расчет, представленный вами в табличке ожидаемых результатов?


Давайте пока отладим запрос, при begin_date = end_date, was_time<=24:00:00, end<=24:00:00, а затем будем выяснять вопросы по исключительным случаям.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
SELECT R.JOB_ID, R.user_id, R.job_name, 
       TimeValue(CDate(SUM(Nz(K.end_time,TIME())- K.begin_time))) AS was_time, 
       TimeValue(CDate(TIME()-MAX(K.begin_time)-M.averagetime+was_time)) AS [END],
       IIf(end>=#17:00:00#,#00:00:00#,#17:00:00#-END) AS free
FROM [Матрица возможности] AS M INNER JOIN 
     (Работа AS R INNER JOIN 
     [Квант времени] AS K 
ON R.JOB_ID = K.JOB_ID) 
ON (M.TYPEJOB_ID = R.typejob_id) AND (M.USER_ID = R.user_id)
WHERE (R.status_id=2) OR (R.status_id=4)
GROUP BY R.JOB_ID, R.user_id, R.job_name, M.averagetime
ORDER BY R.JOB_ID
Огромное спасибо за проделанную работу.
Данный запрос вроде работает правильно, завтра днем проведу контрольный тест.
Осталось разобраться если begin_date <> end_date, was_time>=24:00:00, end>=24:00:00
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
06.05.2011, 10:29 14
Осталось разобраться если begin_date <> end_date, was_time>=24:00:00, end>=24:00:00
Давайте разбираться и не только с этим.
Зачем у вас в таблице "Квант времени" разделены дата и время: begin_date, begin_time и end_date, end_time?
Повторно задаю вопрос зачем держать в таблицах "Работа" и "Квант времени" поля duration, которые являются вычисляемыми, т.е. рассчитываются на основании значений других полей? В нормализованных базах (почитайте на досуге о нормализации БД) не допускается размещения в таблицах полей, значения которых свободно могут быть вычислены в запросах.

Обозначим через T "момент запуска запроса пользователем", содержащим сведения о дата+время. Предположим, что вместо двух полей begin_date, begin_time имеем одно, объединяющее их поле begin_dt, и соответственно вместо end_date, end_time - end_dt. Для ясности будем вести все рассуждения для одного JOB_ID, имеющего статус равный 2 или 4.

Разберемся сначала с вычислением was_time.
Правильно ли я понимаю, что статус равный 2 или 4 гарантирует наличие в таблице "Квант времени" единственной записи с пустым значением поля end_dt, при этом значение поля begin_dt этой записи является максимальным из всех begin_dt записей рассматриваемого JOB_ID?
Верно ли утверждение, что T всегда больше или равно Max(beg_dt)? Если нет, то как вести расчет?
0
noname
06.05.2011, 22:28 15
Цитата Сообщение от minob Посмотреть сообщение
Давайте разбираться и не только с этим.
Зачем у вас в таблице "Квант времени" разделены дата и время: begin_date, begin_time и end_date, end_time?
Повторно задаю вопрос зачем держать в таблицах "Работа" и "Квант времени" поля duration, которые являются вычисляемыми, т.е. рассчитываются на основании значений других полей? В нормализованных базах (почитайте на досуге о нормализации БД) не допускается размещения в таблицах полей, значения которых свободно могут быть вычислены в запросах.
Я просто мало знаком с базами данными и тем более с Access. Поля begin_date, begin_time и end_date, end_time были так разделены чисто из за удобства их использования при вычисленниях.
Поле duration в таблице "Работа" необходимо по условию данной задачи, в таблице "Квант времени"-было сделано тоже для облегчения вычисления в запросах.

Цитата Сообщение от minob Посмотреть сообщение
Обозначим через T "момент запуска запроса пользователем", содержащим сведения о дата+время. Предположим, что вместо двух полей begin_date, begin_time имеем одно, объединяющее их поле begin_dt, и соответственно вместо end_date, end_time - end_dt. Для ясности будем вести все рассуждения для одного JOB_ID, имеющего статус равный 2 или 4.

Разберемся сначала с вычислением was_time.
Правильно ли я понимаю, что статус равный 2 или 4 гарантирует наличие в таблице "Квант времени" единственной записи с пустым значением поля end_dt, при этом значение поля begin_dt этой записи является максимальным из всех begin_dt записей рассматриваемого JOB_ID?
Верно ли утверждение, что T всегда больше или равно Max(beg_dt)? Если нет, то как вести расчет?
Статус 2 или 4 гарантирует наличие только одной записи с пустым значением end_dt, однако записей в таблице "Квант времени" с заполнеными полями begin_dt и утв_ве может быть неограниченное число.
На счет Т:если знаечение Т будет всегда состоять из связки даты и времени то ваше утверждение верно.
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
06.05.2011, 23:48 16
Поля begin_date, begin_time и end_date, end_time были так разделены чисто из за удобства их использования при вычисленниях.
Удобства очень сомнительные, т.к. если учитывать не только время, но и даты, то эти поля нужно теперь сводить в единое целое. Будем считать вопрос их объединения решенным?
Поле duration в таблице "Работа" необходимо по условию данной задачи, в таблице "Квант времени"-было сделано тоже для облегчения вычисления в запросах.
и, поверьте моему опыту, для усложнения вашей и пользователя работы. Вы заметили, что в запросе мной не использовались поля duration. Кстати про запрос, как прошло тестирование?
0
noname
06.05.2011, 23:57 17
Цитата Сообщение от minob Посмотреть сообщение
Удобства очень сомнительные, т.к. если учитывать не только время, но и даты, то эти поля нужно теперь сводить в единое целое. Будем считать вопрос их объединения решенным?
Да

Цитата Сообщение от minob Посмотреть сообщение
и, поверьте моему опыту, для усложнения вашей и пользователя работы. Вы заметили, что в запросе мной не использовались поля duration. Кстати про запрос, как прошло тестирование?
Большое спасибо за данный вами запрос
тестирование прошло хорошо, по путно нашел ошибку у себя в записи данных
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
07.05.2011, 09:52 18
Еще один довод в пользу отказа от полей duration.
Так по своему смыслу эти поля являются промежутками времени, то пока промежутки меньше 24 часов их еще можно втиснуть в поля типа Дата/Время, хотя данный тип предусматривает хранение МОМЕНТА времени, а если промежуток будет превышать 24 часа, то его храненине нужно организовывать по другому.
С этим вопросом мы сейчас и столкнемся на примере поля averagetime таблицы "Матрица возможности" (кстати, вы так и не вняли моему совету о вредности пробелов в именах таблиц, полей ...). Значение averagetime можно хранить:
- в текстовом поле в виде "дд чч:мм:cc", т.е. дни часы:минуты:секунды. Для ввода использовать маску ввода;
- в двух полях: одно целого типа для дней, второе типа Дата/Время для времени;
- ваши предложения.
Какой вариант на ваш взгляд предпочтительней?

Теперь поговорим о вычислении end в запросе. По вашему алгоритму
"end"-вычисляется путем разницы между Time() и суммой последней записи Квант времени.begin_time и предполагаемым временем окончания (находится путем вычитания из среднего времени выполнения(таблица матрица возможностей и поле averagetime), время которое уже было затрачено на работу)
получается, что
end=T-(Max(beg_dt)+(averagetime-was_time))
или если раскрыть скобки и сгруппировать по другому, то получим
end=(T-Max(begin_dt))-(averagetime-was_time)
Глядя на эту формулу, закрадываются некоторые сомнения, может быть потому, что я чего-то не знаю и недопонимаю:
- если нужно определить end, начиная с момента Т, то должно, по идее, быть
end=averagetime-was_time;
- если же точкой отсчета для определения end является Max(begin_dt), то
end=averagetime-(was_time-(T-Max(begin_dt)))
или после преобразований
end=(T-Max(begin_dt))+(averagetime-was_time).
Подумайте над этим и тем, что если с работой затянули, то end может быть отрицательным. Что выводить в этом случае?
0
noname
07.05.2011, 13:41 19
Цитата Сообщение от minob Посмотреть сообщение
Еще один довод в пользу отказа от полей duration.
Так по своему смыслу эти поля являются промежутками времени, то пока промежутки меньше 24 часов их еще можно втиснуть в поля типа Дата/Время, хотя данный тип предусматривает хранение МОМЕНТА времени, а если промежуток будет превышать 24 часа, то его храненине нужно организовывать по другому.
С этим вопросом мы сейчас и столкнемся на примере поля averagetime таблицы "Матрица возможности" (кстати, вы так и не вняли моему совету о вредности пробелов в именах таблиц, полей ...). Значение averagetime можно хранить:
- в текстовом поле в виде "дд чч:мм:cc", т.е. дни часы:минуты:секунды. Для ввода использовать маску ввода;
- в двух полях: одно целого типа для дней, второе типа Дата/Время для времени;
- ваши предложения.
Какой вариант на ваш взгляд предпочтительней?
Мне больше нравистя 1 вариант.

Цитата Сообщение от minob Посмотреть сообщение
Теперь поговорим о вычислении end в запросе. По вашему алгоритму получается, что
end=T-(Max(beg_dt)+(averagetime-was_time))
или если раскрыть скобки и сгруппировать по другому, то получим
end=(T-Max(begin_dt))-(averagetime-was_time)
Глядя на эту формулу, закрадываются некоторые сомнения, может быть потому, что я чего-то не знаю и недопонимаю:
- если нужно определить end, начиная с момента Т, то должно, по идее, быть
end=averagetime-was_time;
- если же точкой отсчета для определения end является Max(begin_dt), то
end=averagetime-(was_time-(T-Max(begin_dt)))
или после преобразований
end=(T-Max(begin_dt))+(averagetime-was_time).
Подумайте над этим и тем, что если с работой затянули, то end может быть отрицательным. Что выводить в этом случае?
После пересмотра алгоритма end я понял что бы не прав и не верно вам изложил способ подсчета поля end
enв должен считаться так: end=(Работа.begin+averagetime)-was_time.
На счет того что если end отрицательный: если работа затянится то будет даже лучше если будет показываться время со знаком "-".
noname
07.05.2011, 13:46 20
Цитата Сообщение от minob Посмотреть сообщение
кстати, вы так и не вняли моему совету о вредности пробелов в именах таблиц, полей ..
я ваш совет принял и впредь буду всегда пользоваться им, просто нужно будет очень много переделывать если убрать пробел в названии.
07.05.2011, 13:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2011, 13:46
Помогаю со студенческими работами здесь

Подсчет времени занятия (по заданному времени начала и окончания)
В первой строке написано три целых числа A, B, C (0 ≤ A ≤ 23, 0 ≤ B ≤ 59, 0 ≤ C ≤...

Подсчет времени в реальном времени
Добрый день, подскажи пожалуйста как нужно сделать что бы подсчитать количество часов. В первом...

Подсчет времени
Здравствуйте, подскажите пожалуйста, как посчитать, сколько времени будет длиться сортировка?...

подсчет времени
есть консольное приложение подскажите как вывести текущую дату и время и посчитать сколько...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru