Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/32: Рейтинг темы: голосов - 32, средняя оценка - 4.88
noname

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

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

Студворк — интернет-сервис помощи студентам
Добрый день.
Помоги с такой задачкой.
Есть 2 таблицы:Квант времени, Работа.
Поля в таблице Работа: JOB_ID, begin, duration, status_id
Поля в таблице Квант времени: JOB_ID, duration.
Суть проблемы:
нужно сложить поле Квант времени.duration для которых поле Квант времени.JOB_ID=Работа.JOB_ID
при этом если эта сумма равна 0 то нужно найти разницу между Работа.begin и сейчас.
Желательно это все реализовать в виде запроса по таблице Работа.
Помогите пожалуйста.
Заранее спасибо.
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.05.2011, 11:19
Ответы с готовыми решениями:

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

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

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

31
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
07.05.2011, 17:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от noname
Мне больше нравистя 1 вариант.
Учитывая это чистосердечное признание ,
Цитата Сообщение от noname
Я просто мало знаком с базами данными и тем более с Access.
я бы вам посоветовал 2-ой вариант.
Цитата Сообщение от noname
После пересмотра алгоритма end я понял что бы не прав и не верно вам изложил способ подсчета поля end
enв должен считаться так: end=(Работа.begin+averagetime)-was_time.
Разборки: Работа.begin - момент времени, averagetime и was_time - промежутки времени, таким образом end получается неким, причем непонятно каким, моментом времени, а вы ведь трактовали
Цитата Сообщение от noname
"end"-время которое предполагается еще затратить на выполнения работы
end, как промежуток.
Если же вы хочете определить предполагаемый момент времени окончания работы, то, как мне кажется,
end=Работа.begin+averagetime
0
noname
08.05.2011, 02:08
Цитата Сообщение от minob Посмотреть сообщение
Учитывая это чистосердечное признание ,
я бы вам посоветовал 2-ой вариант.
я все так за первый вариант потому что переделка породит много ошибок из других областей бд и это может затянуть время сдачи этой работы
как вариант(вот только я не знаю как его реализовать): можно сделать текстовое поле и в него по очередно записывать часы, минуты, секунды, причем часы должны записываться в числовым типом чтобы количество часов переходило за 24
или время которое больше 24 часов access не примет и выдаст ошибку несовместимости типов?

Цитата Сообщение от minob Посмотреть сообщение
Разборки: Работа.begin - момент времени, averagetime и was_time - промежутки времени, таким образом end получается неким, причем непонятно каким, моментом времени, а вы ведь трактовали

end, как промежуток.
Если же вы хочете определить предполагаемый момент времени окончания работы, то, как мне кажется,
end=Работа.begin+averagetime
end все так является промежутком времени до предпологаемого окончания работы(Работа.begin+averagetime) и оно должно вычисляться как раз по той формуле которую я написал в своей предыдущем посте
Цитата Сообщение от noname Посмотреть сообщение
end=(Работа.begin+averagetime)-was_time.
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
08.05.2011, 08:58
как вариант(вот только я не знаю как его реализовать): можно сделать текстовое поле и в него по очередно записывать часы, минуты, секунды, причем часы должны записываться в числовым типом чтобы количество часов переходило за 24
или время которое больше 24 часов access не примет и выдаст ошибку несовместимости типов?
Из всего этого, извините, набора слов понял, что averagetime должно быть текстовым поле и информация в нем содержалась в виде часы:минуты:секунды и что есть какие-то непонятные сомнения в возможности реализации.
Так как поле - текстовое, то в него можно вводить какой угодно набор символов. Главное, чтобы затем, когда понадобиться значение averagetime, можно было однозначно извлечь из этого поля количество часов, минут, секунд, т.е. информация должна вводиться в заранее оговоренном формате. На вас, как программисте, лежит задача обеспечить ввод именно в таком формате, потому что если это отдать на откуп пользователям, то там будет сплошная каша. Как я уже ранее упоминал, для этого есть свойство поля Маска ввода (InputMask), см.Help.
Продумайте четко формат представления вашей хотелки, это нужно будет при реализации запроса.
Цитата Сообщение от noname
end все так является промежутком времени до предпологаемого окончания работы(Работа.begin+averagetime) и оно должно вычисляться как раз по той формуле которую я написал в своей предыдущем посте
Цитата Сообщение от noname
end=(Работа.begin+averagetime)-was_time.
Как говорят на востоке: сколько ни говори халва, от этого во рту слаще не будет.
Пример:
begin=03.05.2011 11:00:00
averagetime=22:00:00
was_time=18:00:00
Считаем ручками
end=(Работа.begin+averagetime)-was_time=(03.05.2011 11:00:00 + 22:00:00) - 18:00:00 =
= 04.05.2011 09:00:00 - 18:00:00 = 03.05.2011 15:00:00
Считаем в Access-е
Visual Basic
1
2
3
4
5
begin=#05/03/2011 11:00:00#
averagetime=#22:00:00#
was_time=#18:00:00#
?CDate((begin+averagetime)-was_time)
03.05.2011 15:00:00
Итак, получаем не промежуток, а какой-то непонятный по своей сути момент времени.

Теперь то, что вам нужно. Если на выполнение некоторой работы планировалось затратить 22 часа, а на какой-то текущий момент T стало известно, что по ней уже отработали 18 часов, то для окончания работы предположительно понадобиться 22-18=4 часа. Т.е. end=averagetime-was_time.
0
noname
08.05.2011, 10:43
Цитата Сообщение от minob Посмотреть сообщение
Из всего этого, извините, набора слов понял, что averagetime должно быть текстовым поле и информация в нем содержалась в виде часы:минуты:секунды и что есть какие-то непонятные сомнения в возможности реализации.
Так как поле - текстовое, то в него можно вводить какой угодно набор символов. Главное, чтобы затем, когда понадобиться значение averagetime, можно было однозначно извлечь из этого поля количество часов, минут, секунд, т.е. информация должна вводиться в заранее оговоренном формате. На вас, как программисте, лежит задача обеспечить ввод именно в таком формате, потому что если это отдать на откуп пользователям, то там будет сплошная каша. Как я уже ранее упоминал, для этого есть свойство поля Маска ввода (InputMask), см.Help.
Продумайте четко формат представления вашей хотелки, это нужно будет при реализации запроса.
Данные в поле averagetime вводит не пользователь, а система по заданному алгоритму, так что я думаю проблем с форматом ввода быть не должна.
На счет непонятной кучи моих слов про текстовое поле:
Суть задумки была в том чтобы в текстовое поле вводить часы:минуты:секунды, причем часы-могут быть больше 24
Сомнения заключаются в том что при извлечении этих данных, например averagetime=43:30:00, и последующем использовании будет ли Access корректно понимать число 43 или выдаст ошибку, что значение поля averagetime ошибочно.

Цитата Сообщение от minob Посмотреть сообщение
Как говорят на востоке: сколько ни говори халва, от этого во рту слаще не будет.
Пример:
begin=03.05.2011 11:00:00
averagetime=22:00:00
was_time=18:00:00
Считаем ручками
end=(Работа.begin+averagetime)-was_time=(03.05.2011 11:00:00 + 22:00:00) - 18:00:00 =
= 04.05.2011 09:00:00 - 18:00:00 = 03.05.2011 15:00:00
Считаем в Access-е
Visual Basic
1
2
3
4
5
begin=#05/03/2011 11:00:00#
averagetime=#22:00:00#
was_time=#18:00:00#
?CDate((begin+averagetime)-was_time)
03.05.2011 15:00:00
Итак, получаем не промежуток, а какой-то непонятный по своей сути момент времени.

Теперь то, что вам нужно. Если на выполнение некоторой работы планировалось затратить 22 часа, а на какой-то текущий момент T стало известно, что по ней уже отработали 18 часов, то для окончания работы предположительно понадобиться 22-18=4 часа. Т.е. end=averagetime-was_time.
По данному примеру я понял что я опять ошибался, спасибо что все разъяснили в понятно форме.
Тогда ваш способ подсчета нужно применять.
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
08.05.2011, 12:45
Суть задумки была в том чтобы в текстовое поле вводить часы:минуты:секунды, причем часы-могут быть больше 24
Сомнения заключаются в том что при извлечении этих данных, например averagetime=43:30:00, и последующем использовании будет ли Access корректно понимать число 43 или выдаст ошибку, что значение поля averagetime ошибочно.
Ни в Access, ни в Jet нет такого понятия - период времени, есть момент времени. То, что период времени, меньший 24 часов, можно втиснуть в поле типа Дата/Время - какие-то Microsoft-овские ухищрения. Если averagetime использовать именно в виде 43:30:00, то естественно напоремся на ошибку и, чтобы этого не случилось, нужно будет производить некоторые преобразования.
Значит договорились, что averagetime - текстовое поле и значения в нем представлены в формате чч:мм:сс, при этом часть чч может содержать несколько (>=1) цифр, части мм и сс - по две цифры, причем первая цифра меньше 6, части разделены символом двоеточия.

Результаты расчетов, превышающие 24 часа, тоже выводить в таком формате?

Теперь осталось решить вопрос с free. Если обозначить через t - текущее время (без даты) - время, когда пользователь инициировал выполнение запроса, то по-моему в случае end>=0 и t<17:00:00 схематично формула должна выглядеть так
free = IIf(t + end >= 17:00:00, 00:00:00, 17:00:00 - (t + end))
Обдумайте формулу и как поступать, когда end<0 или t>17:00:00.
0
noname
08.05.2011, 13:23
Цитата Сообщение от minob Посмотреть сообщение
Ни в Access, ни в Jet нет такого понятия - период времени, есть момент времени. То, что период времени, меньший 24 часов, можно втиснуть в поле типа Дата/Время - какие-то Microsoft-овские ухищрения. Если averagetime использовать именно в виде 43:30:00, то естественно напоремся на ошибку и, чтобы этого не случилось, нужно будет производить некоторые преобразования.
Значит договорились, что averagetime - текстовое поле и значения в нем представлены в формате чч:мм:сс, при этом часть чч может содержать несколько (>=1) цифр, части мм и сс - по две цифры, причем первая цифра меньше 6, части разделены символом двоеточия.
Да
Цитата Сообщение от minob Посмотреть сообщение
Результаты расчетов, превышающие 24 часа, тоже выводить в таком формате?
Да

Цитата Сообщение от minob Посмотреть сообщение
Теперь осталось решить вопрос с free. Если обозначить через t - текущее время (без даты) - время, когда пользователь инициировал выполнение запроса, то по-моему в случае end>=0 и t<17:00:00 схематично формула должна выглядеть так
free = IIf(t + end >= 17:00:00, 00:00:00, 17:00:00 - (t + end))
Обдумайте формулу и как поступать, когда end<0 или t>17:00:00.
Формула верная.
Если end<0, то в идеале нужно писать "работа затянулась" или что-то типа такого, в поле free.
Если t>17:00:00: обычно этот отчет должен запускаться в рабочее время, т.е. до 17:00, после 17:00 данные о работе туда не должны попадать, так как будут иметь статус отличный от 2 или 4. Если все таки будет он запушен после 17:00 и какие либо данные попадут туда, то поле free должно быть пустым.
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
08.05.2011, 13:50
На какой версии(иях) Access будет крутиться задача?
Вопроса бы не возникло, если бы не злополучные пробелы в наименованиях таблиц.
0
noname
08.05.2011, 13:55
Цитата Сообщение от minob Посмотреть сообщение
На какой версии(иях) Access будет крутиться задача?
Вопроса бы не возникло, если бы не злополучные пробелы в наименованиях таблиц.
Задача будет крутиться на версиях 2007 и 2010 офисса.
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
08.05.2011, 18:18
Пробуйте тестировать запрос
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT JOB_ID, user_id, job_name, FPerToStr(wt) AS was_time, FPerToStr(e) AS [END], fr AS free
FROM
(SELECT R.JOB_ID, R.user_id, R.job_name, 
       SUM(Nz(K.end_dt,Now())- K.begin_dt) AS wt, 
       CInt(LEFT(M.averagetime,Len(M.averagetime)-6)) AS h,
       h\24 + CDate((h MOD 24) & RIGHT(M.averagetime,6)) - wt AS e,
       IIf(e<0, 'Работа затянулась', IIf(TIME() + e > #17:00:00#, NULL, FPerToStr(#17:00:00# - (TIME() + e)))) AS fr
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) AS Q
ORDER BY JOB_ID
К нему функция, которую поместите в стандартный модуль
Visual Basic
1
2
3
Public Function FPerToStr(fld) As String
  FPerToStr = IIf(fld < 0, "-", "") & Int(Abs(fld) * 24) & Format(CDate(fld), "\:nn\:ss")
End Function
0
noname
09.05.2011, 18:48
Цитата Сообщение от minob Посмотреть сообщение
Пробуйте тестировать запрос
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT JOB_ID, user_id, job_name, FPerToStr(wt) AS was_time, FPerToStr(e) AS [END], fr AS free
FROM
(SELECT R.JOB_ID, R.user_id, R.job_name, 
       SUM(Nz(K.end_dt,Now())- K.begin_dt) AS wt, 
       CInt(LEFT(M.averagetime,Len(M.averagetime)-6)) AS h,
       h\24 + CDate((h MOD 24) & RIGHT(M.averagetime,6)) - wt AS e,
       IIf(e<0, 'Работа затянулась', IIf(TIME() + e > #17:00:00#, NULL, FPerToStr(#17:00:00# - (TIME() + e)))) AS fr
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) AS Q
ORDER BY JOB_ID
К нему функция, которую поместите в стандартный модуль
Visual Basic
1
2
3
Public Function FPerToStr(fld) As String
  FPerToStr = IIf(fld < 0, "-", "") & Int(Abs(fld) * 24) & Format(CDate(fld), "\:nn\:ss")
End Function
Огромное спасибо вам, просто огроменное
просто нереально сильно выручили,
тока сейчас увидел ваш пост
Сильно загружен в связи с тем что готовлю отчет для преддипломной защиты.
Вроде все правильно работает(глянул так не особо сильно проверяя точность, из за загруженности)
но вызвало пару вопросов:
что происходит тут:
Цитата Сообщение от minob Посмотреть сообщение
h\24 + CDate((h Mod 24)
и тут
Цитата Сообщение от minob Посмотреть сообщение
Int(Abs(fld) * 24)
noname
10.05.2011, 01:31
только сейчас заметил ошибку свою
хотел написать вот так:
Цитата Сообщение от minob Посмотреть сообщение
h\24 + CDate((h Mod 24) & RIGHT(M.averagetime,6)) - wt
извеняюсь о опечатке.
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
10.05.2011, 09:07
Сначала немного теории.
Значения типа Date/Time сохраняются как 64-разрядные (8-байтовые) числа с плавающей точкой стандарта IEEE. При преобразовании других числовых типов данных к типу Date целая часть числа представляет значение даты (количество дней прошедших с 30.12.1899), а дробная - значение времени (части суток), т.е. полночь представляется значением 0, а полдень значением .5. Отрицательные целые числа представляют даты до 30.12.1899.

В запросе операции с интервалами выполняются над поставленными им в соответствие значениями даты+времени или, что то же самое, числами.

Ниже, в интересующем вас фрагменте запроса, идет преобразование текста, содержащегося в поле averagetime, в числовой вид, описанный выше
SQL
1
2
3
4
 ...
CInt(LEFT(M.averagetime,Len(M.averagetime)-6)) AS h,
h\24 + CDate((h MOD 24) & RIGHT(M.averagetime,6)) - wt AS e,
...
Первая строка - вычленение часовой части из averagetime и преобразование ее к целому числу (h).
Во второй строке определяется количество полных дней, содержащихся в h часах (h\24, знак \ - целочисленное деление), количество часов, представляющих остаток (h Mod 24) от целочисленного деления, и выделяется значения минут и секунд ( RIGHT(M.averagetime,6) ) из строки averagetime. Выражение CDate((h Mod 24) & RIGHT(M.averagetime,6)) дает чистое время, сложив которое с количеством дней (h\2), получаемм некую дату, соответсвующую рассматриваемому интервалу.
Пример.
averagetime="43:12:56"
h=CInt(LEFT(M.averagetime,Len(M.averaget ime)-6))=43
h\24=1
h Mod 24=19
RIGHT(M.averagetime,6)=":12:56"
CDate((h Mod 24) & RIGHT(M.averagetime,6))=19:12:56
h\24 + CDate((h Mod 24) & RIGHT(M.averagetime,6))=31.12.1899 19:12:56 ~ 1,80064814814815

Функция FPerToStr предназначена для преобразования интервала из датного (числового) вида в строку "чч:мм:сс", аналогичную averagetime. Свежий взгляд на выражение в функции показал, что его можно немного упростить
Visual Basic
1
2
3
Public Function FPerToStr(fld) As String
  FPerToStr = Fix(fld * 24) & Format(CDate(fld), "\:nn\:ss")
End Function
Ну, здесь все просто. Вычисляется количество часов ( Fix(fld * 24) ), содержащихся в периоде, и конкатенируется с его минутами и секундами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.05.2011, 09:07

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru