powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как просуммировать часы?
37 сообщений из 37, показаны все 2 страниц
Как просуммировать часы?
    #32794336
Mari.P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица T1 Организация,время_работы,стоимость_работ

формат данных поля Время_работы - краткий формат времени.

Запрос:

SELECT T1.Организация, Sum(T1.время_работы) AS [Sum-время_работы]
FROM T1
GROUP BY T1.Организация;

Естественно Sum(T1.время_работы) работает неправильно. Подскажите плиз как правильно просуммировать время с группировкой по организации
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32794384
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если Время_работы - краткий формат времени не превышает 24 часов, то можно воспользоваться функцией CDbl
SELECT T1.Организация, Sum(CDbl(T1.время_работы)) AS [Sum-время_работы]
FROM T1
GROUP BY T1.Организация

В противном случае - несколько сложнее, надо будет переводитьвремя в фомат даты, те день, как целое число и опять же CDbl на оставшуюся часть.

Но это не все, для того чтобы теперь показать Sum-время_работы, например в формате ччч:мм нужна будет функция переводящая Double в стринг
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32794419
Фотография Finans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Складывать значения формата "Краткий формат времени" всё равно, что складывать даты: (22-ноя-2004) + (23-ноя-2004). Продолжительность каких-то событий необходимо хранить в единицах (часах, минутах, ..), т.е. в числовом формате.
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32794422
Mari.P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функцию написать - можно конечно, вот только как обратиться к этой функции в запросе???
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32794436
Iskander68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем бы ее тогда писать, если бы к ней нельзя было обратиться? :-) Точно
также, как ко встроенным функциям - имя, аргументы, если есть.

--
Regards
Alexander Artamonov

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32794443
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mari.PФункцию написать - можно конечно, вот только как обратиться к этой функции в запросе???

А чего сложного?

Допустим, ф-ия такая:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Function DoubleToTime(ts As Double, Optional WithOutSec As Boolean) As String
    Dim t As Double, S As String

    t = ts *  24  *  60  *  60    'sec
    S = Format(Int(t \  3600 ), "00") & ":"
    t = t Mod  3600 
    S = S & Format(Int(t \  60 ), "00")
    If WithOutSec Then
        S = S & ":"
        t = t Mod  60 
        S = S & Format(t, "00")
    End If
    
    DoubleToTime = S

End Function

Твой запрос сохраняем, например в ААА и тогда

Код: plaintext
1.
SELECT ААА.Организация, DoubleToTime(ААА.[Sum-время_работы],  0 ) AS время_работы
FROM ААА
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32794456
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FinansСкладывать значения формата "Краткий формат времени" всё равно, что складывать даты: (22-ноя-2004) + (23-ноя-2004). Продолжительность каких-то событий необходимо хранить в единицах (часах, минутах, ..), т.е. в числовом формате.

Формат даты на самом деле и есть числовой формат (Double )
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32794458
Mari.P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за помощь, но если время больше 24 часов то запрос вернет ерунду?
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32794493
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mari.PСпасибо за помощь, но если время больше 24 часов то запрос вернет ерунду?
Ну почему же ерунду? Он вернет: смешанное число, целая часть которого - количество дней, тк при умножении не 24 - кол-во часов, а дробная часть - это части дня: 1 сек = 1/24/60/60. Отсюда и пляшем!
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32794579
Mari.P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо щас применим на практике
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32794622
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так не получится?

SELECT T1.Организация, Sum(CDate(T1.время_работы)) AS [Sum-время_работы]
FROM T1
GROUP BY T1.Организация
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32794667
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейКтак не получится?

SELECT T1.Организация, Sum(CDate(T1.время_работы)) AS [Sum-время_работы]
FROM T1
GROUP BY T1.Организация

Получается следующее:
CurrentDb.Execute "create table t (h time)"

CurrentDb.Execute "INSERT INTO t (h) VALUES ( ""12:20"")"
CurrentDb.Execute "INSERT INTO t (h) VALUES ( ""12:20"")"
CurrentDb.Execute "INSERT INTO t (h) VALUES ( ""12:20"")"
CurrentDb.Execute "INSERT INTO t (h) VALUES ( ""12:20"")"
CurrentDb.Execute "INSERT INTO t (h) VALUES ( ""12:20"")"
CurrentDb.Execute "INSERT INTO t (h) VALUES ( ""12:20"")"

SELECT Sum(CDate([h])) AS HH
FROM t;
результат: 3.0833333333333

Применяем мою функцию, получаем
?DoubleToTime(3.0833333333333,0)
74:00
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32794680
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а так?

Код: plaintext
1.
SELECT datediff( "h", 0  ,Sum(CDate([h]))) AS HH
FROM t
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32794693
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
SELECT datediff( "n", 0  ,Sum(CDate([h])))      AS minutes
FROM t
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32794702
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейК
Код: plaintext
1.
SELECT datediff( "n", 0  ,Sum(CDate([h])))      AS minutes
FROM t


Но часы нужны не от 0 а только остаток, а тогда сложно выходит
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32794712
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так:

SELECT datediff( "h",0 ,Sum(CDate([h]))) & ":" & format(datediff( "n",datediff( "h",0 ,Sum(CDate([h])))/24 ,Sum(CDate([h]))),"00") as WorkTime
FROM t
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32795178
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Че вы тут обсуждаете не пойму. Девушка имхо просто неверный тип данных для поля выбрала. Поле Время_работы должно быть карренси. И все.
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32795348
Iskander68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шарк, а почему именно карренси - а не дабл или сингл?

--
Regards
Alexander Artamonov

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32795859
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У карренси целочисленная арифметика. Там 2+2 всегда 4. А с этими мантиссами я наелся, спасибо. Всякие (2+2>4-e) and (2+2<4+e)
НИКОГДА не надо использовать эту гадость, разве что звезду понадобится в килограммах измерить:-)
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32795962
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shark
Можно по-подробнее? Какая разница между Date, Currency и Double в этом случае? Если хранить время (чч:мм) в Currency или в каком другом числовом типе (кроме целочисленного), то число в любом случае будет дробным. Так при чем здесь рассуждения про 2+2 = 4?
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32796097
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Можно поподробнее
Можно.
Девушке не надо хранить время. И формат ДатаВремя тут не причем, он не предназначен для хранения промежутков времени, он предназначен для записи конкретного времени и даты. Нужно записать просто дробное число(количество человекочасов или человеколет). А для записи дробных чисел правильнее использовать карренси, а не дабл, потому что дважды два :^)
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32796273
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю, что все это - дело вкуса! Действительно, нет подходящего формата для хранения промежутков времени. Если они (промежутки) гарантированно меньше 24 часов, мне больше нравится хранить их как есть в формате времени.Легче при показе в формах и отчетах. При необходимости проведения над ними арифметических вычеслений, можно пользоваться почти всеми встроенными функциями времени и даты. Неудобства возникают только при превышении в сумме единицы. Но и эта проблема достаточно легко решается при помощи вышеизложенных вычисений или функций.
А при применении типа денег, как то не очень приятно видеть в напрямую открытой таблице символ доллара или фунта или еще какой-нибудь деньги (шекеля к примеру) вместо ожидаемых 00:00
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32796911
не шарк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rivkin Dmitry...А при применении типа денег, как то не очень приятно видеть в напрямую открытой таблице символ доллара или фунта или еще какой-нибудь деньги (шекеля к примеру) вместо ожидаемых 00:00
А не пробовали в денежном типе РУЧКАМИ вбить в формат поля таблицы hh:nn:ss ? Сильно помогает от шекелей. (но мешает вбивать больше 24 часов) (жаль нет смешанных форматов).


Единственный сущ-й вопрос - об арифметике в дробной части. Если она "целочисленная" и для поля типа "дата время", для которого известно, что внутреннее представление его - "вещественное число" (формат типа данных не указан) - то нет проблем. Для currency она (арифметика) целочислена по умолчанию.
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32797135
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Думаю, что все это - дело вкуса.
ну ну.
Первое- действительно, не надо путать тип данных и свойство формат контрола, в котором они показаны.
Второе- я устал объяснять про грабли, что 1,25+2,75 будет 3,9999999999
Если Вам это не важно, выбирайте тип в соответствии со своим вкусом :-)
Успехов в быстрой разработке отчетов и прямом просмотре таблиц:^)
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32797375
Iskander68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шарк, логика в применении денежного типа для выражения промежутка времени
есть. А вот как наиболее удобным образом его использовать в контексте часов
и минут?

--
Regards
Alexander Artamonov

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32798910
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А вот как наиболее удобным образом его использовать в контексте часов
и минут?
Ну например так
Function ФорматПромежуткаВремениДляКарренси(p1 As Currency) As String
Dim i1 As Long
i1 = Int(p1)
ФорматПромежуткаВремениДляКарренси = _
Format(i1) & " ч. " & Format((p1 - i1) * 60) & " мин."
End Function

>Шарк, логика в применении денежного типа для выражения промежутка времени есть.

Извините за занудство:^) не только для промежутков, но и для практически любых дробных чисел
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32799024
Dmitry-SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shark>1,25+2,75 будет 3,9999999999


А у денежнего формата нет таких "фишек"?
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32799078
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Денежный формат это целое число, деленное на десять тыщ, так что там все пучком.
A double это мантисса и еще чето не помню названия:^), и ессно арифметика там приблизительная.
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32799087
Dmitry-SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wow!
А я, по-наивности, все денежные суммы в доубл зарядил :(

Так; а если идет умножение доубл-числа на деньги результат как будет округляться?
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32799172
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Function fn2()
Dim a1 As Double
Dim a2 As Currency
a1 = 1
a2 = 1
Debug.Print TypeName(a1 * a2)
End Function


Double
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32799351
Iskander68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аналогично, прошу прощения за занудство.
Ну, функция перевода денег во время это понятно. Правда, ИМХО, Format()
здесь лишнее - тем паче с одним аргументом. Амперсанд и так неявно
преобразовывает в строку. К тому же минуты неплохо бы до целых округлить,
типа,
i1 & " ч. " & CInt((p1 - i1) * 60) & " мин."
Но это все детали. А вот что дальше делать? Ну получим мы вычисляемое поле.
Стало быть ввести в него данные нельзя - можно только посмотреть, чему
соответстует 6,89. А если нужно ввести 6 ч. 53 мин.? Делать свободное поле
для ввода строки, через другую функцию преобразовывать ее в карренси и по
некоему событию вносим полученное значение в таблицу? Или как?


--
Regards
Alexander Artamonov

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32799393
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А если нужно ввести 6 ч. 53 мин.?
1) Для меня очевидно, что ни тип, ни формат времени для промежутка времени не подходят категорически. Как реализовать любую требуемую функциональность Вы похоже не хуже меня понимаете.
2) Усердие все превозмогает.
Иногда усердие превозмогает и рассудок.
(с) К.Прутков
:^)
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32799415
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если нужно вввести 1 месяц 3 недели и 2 дня?
Ну нет такого стандартного формата, ручками надо делать.
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32799424
Iskander68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все-таки время мыслится в часах и минутах, а не в десятичных дробях. И
оператор при вводе не должен переводить вручную 6 ч 05 мин в карренси. Я
просто думал, у Вас есть опробованный алгоритм по данному вопросу. Буде
необходимость, обязательно изобрету велосипед. :-)

--
Regards
Alexander Artamonov

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32799451
Фотография Shark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, алгоритма у меня нет.
Я думаю, что поле для ввода строки должно быть не свободным, а связанным, те надо добавить строковое поле в табличку. И если не удалось преобразовать его своим кодом в карренси, то ругаться. А если удалось, то преобразовывать карренси самому обратно и переписывать это поле. Тогда кажется будет работать как будто это стандартный формат.
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32803262
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SharkНет, алгоритма у меня нет.
Я думаю, что поле для ввода строки должно быть не свободным, а связанным, те надо добавить строковое поле в табличку. И если не удалось преобразовать его своим кодом в карренси, то ругаться. А если удалось, то преобразовывать карренси самому обратно и переписывать это поле. Тогда кажется будет работать как будто это стандартный формат.

Нет сомнений - логика в рассуждениях Shark есть! С подобными преобразованиями я столкнулся при использовании географических координат. Поскольку такого типа не существует и, более того, его передают в разных форматах (в градусах и частях градусов, в градусах, минутах и частях минуты, в радусах, минутах, секундах и частях секунды, широта и долгота может присутствовать в буквах или выражаться положительным или отрицательным числом; кроме того широты, как известно изеряются до 90 град., а долготы до 180) то нет другого выхода, как хранить каждую координату в двух полях - численном (для поиска на картах) и стринговом (для показа и ввода на экране). Головной боли - более чем предостаточно!
необходимы функции для взаимного перевода форматов - из числового в стринговый и наоборот, не простой функции, проверяющей корректность введенной координаты и проч. Слава богу, что еще не приходится производить суммирования по координатам! Но приходится вычислять расстояния - и это тоже становится не очень просто.
Это все я привел для примера к тому, что предлагает Shark при работе с денежным форматом в применении к промежуткам времени. Я убежден, что в большинстве случаев (те когда промежутки времени не превышают 24 часа) все-же удобнее хранить их (промежутки времени) в формате даты. нет головной боли при вводе-выводе, а при арифметических действиях над ними необходимы просетйшие функции пеобразования в необходимый стринговый формат - и все! В общем-то и в случае промежутков времени больших чем 24 часа рассуждения - те же. Не должно быть проблем. А что касается точности вычислений, то их тоже можно регулировать не сложным образом, например, добавлением 0.5 секунды для вычислений с точностью до секунды.
...
Рейтинг: 0 / 0
Как просуммировать часы?
    #32803285
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rivkin Dmitry С подобными преобразованиями я столкнулся при использовании географических координат.... Головной боли - более чем предостаточно!
Знакомо:)
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как просуммировать часы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]