Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как просуммировать часы?  [new]
Mari.P
Member

Откуда: Yekaterinburg
Сообщений: 687
Есть таблица T1 Организация,время_работы,стоимость_работ

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

Запрос:

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

Естественно Sum(T1.время_работы) работает неправильно. Подскажите плиз как правильно просуммировать время с группировкой по организации
22 ноя 04, 15:23    [1125879]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
Если Время_работы - краткий формат времени не превышает 24 часов, то можно воспользоваться функцией CDbl
SELECT T1.Организация, Sum(CDbl(T1.время_работы)) AS [Sum-время_работы]
FROM T1
GROUP BY T1.Организация

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

Но это не все, для того чтобы теперь показать Sum-время_работы, например в формате ччч:мм нужна будет функция переводящая Double в стринг
22 ноя 04, 15:38    [1125964]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Finans
Member

Откуда: Novgorod
Сообщений: 60
Складывать значения формата "Краткий формат времени" всё равно, что складывать даты: (22-ноя-2004) + (23-ноя-2004). Продолжительность каких-то событий необходимо хранить в единицах (часах, минутах, ..), т.е. в числовом формате.
22 ноя 04, 15:47    [1126019]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Mari.P
Member

Откуда: Yekaterinburg
Сообщений: 687
Функцию написать - можно конечно, вот только как обратиться к этой функции в запросе???
22 ноя 04, 15:48    [1126022]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Iskander68
Member

Откуда: Королев М.О.
Сообщений: 877

А зачем бы ее тогда писать, если бы к ней нельзя было обратиться? :-) Точно
также, как ко встроенным функциям - имя, аргументы, если есть.

--
Regards
Alexander Artamonov

Posted via ActualForum NNTP Server 1.1

22 ноя 04, 15:54    [1126039]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
Mari.P
Функцию написать - можно конечно, вот только как обратиться к этой функции в запросе???


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

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

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

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

SELECT ААА.Организация, DoubleToTime(ААА.[Sum-время_работы], 0) AS время_работы
FROM ААА
22 ноя 04, 15:56    [1126048]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
Finans
Складывать значения формата "Краткий формат времени" всё равно, что складывать даты: (22-ноя-2004) + (23-ноя-2004). Продолжительность каких-то событий необходимо хранить в единицах (часах, минутах, ..), т.е. в числовом формате.


Формат даты на самом деле и есть числовой формат (Double )
22 ноя 04, 15:58    [1126065]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Mari.P
Member

Откуда: Yekaterinburg
Сообщений: 687
Спасибо за помощь, но если время больше 24 часов то запрос вернет ерунду?
22 ноя 04, 16:01    [1126068]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
Mari.P
Спасибо за помощь, но если время больше 24 часов то запрос вернет ерунду?

Ну почему же ерунду? Он вернет: смешанное число, целая часть которого - количество дней, тк при умножении не 24 - кол-во часов, а дробная часть - это части дня: 1 сек = 1/24/60/60. Отсюда и пляшем!
22 ноя 04, 16:17    [1126123]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Mari.P
Member

Откуда: Yekaterinburg
Сообщений: 687
Спасибо щас применим на практике
22 ноя 04, 16:41    [1126238]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
так не получится?

SELECT T1.Организация, Sum(CDate(T1.время_работы)) AS [Sum-время_работы]
FROM T1
GROUP BY T1.Организация
22 ноя 04, 16:53    [1126309]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
АлексейК
так не получится?

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
22 ноя 04, 17:04    [1126393]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
а так?

SELECT datediff( "h",0 ,Sum(CDate([h]))) AS HH
FROM t
22 ноя 04, 17:10    [1126422]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
SELECT datediff( "n",0 ,Sum(CDate([h])))      AS minutes
FROM t
22 ноя 04, 17:13    [1126452]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
АлексейК
SELECT datediff( "n",0 ,Sum(CDate([h])))      AS minutes
FROM t


Но часы нужны не от 0 а только остаток, а тогда сложно выходит
22 ноя 04, 17:18    [1126469]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
Примерно так:

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
22 ноя 04, 17:23    [1126486]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Shark
Member

Откуда:
Сообщений: 2365
Че вы тут обсуждаете не пойму. Девушка имхо просто неверный тип данных для поля выбрала. Поле Время_работы должно быть карренси. И все.
23 ноя 04, 08:37    [1127200]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Iskander68
Member

Откуда: Королев М.О.
Сообщений: 877

Шарк, а почему именно карренси - а не дабл или сингл?

--
Regards
Alexander Artamonov

Posted via ActualForum NNTP Server 1.1

23 ноя 04, 10:31    [1127592]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Shark
Member

Откуда:
Сообщений: 2365
У карренси целочисленная арифметика. Там 2+2 всегда 4. А с этими мантиссами я наелся, спасибо. Всякие (2+2>4-e) and (2+2<4+e)
НИКОГДА не надо использовать эту гадость, разве что звезду понадобится в килограммах измерить:-)
23 ноя 04, 13:29    [1128700]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
Shark
Можно по-подробнее? Какая разница между Date, Currency и Double в этом случае? Если хранить время (чч:мм) в Currency или в каком другом числовом типе (кроме целочисленного), то число в любом случае будет дробным. Так при чем здесь рассуждения про 2+2 = 4?
23 ноя 04, 13:59    [1128870]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Shark
Member

Откуда:
Сообщений: 2365
>Можно поподробнее
Можно.
Девушке не надо хранить время. И формат ДатаВремя тут не причем, он не предназначен для хранения промежутков времени, он предназначен для записи конкретного времени и даты. Нужно записать просто дробное число(количество человекочасов или человеколет). А для записи дробных чисел правильнее использовать карренси, а не дабл, потому что дважды два :^)
23 ноя 04, 14:36    [1129104]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5500
Думаю, что все это - дело вкуса! Действительно, нет подходящего формата для хранения промежутков времени. Если они (промежутки) гарантированно меньше 24 часов, мне больше нравится хранить их как есть в формате времени.Легче при показе в формах и отчетах. При необходимости проведения над ними арифметических вычеслений, можно пользоваться почти всеми встроенными функциями времени и даты. Неудобства возникают только при превышении в сумме единицы. Но и эта проблема достаточно легко решается при помощи вышеизложенных вычисений или функций.
А при применении типа денег, как то не очень приятно видеть в напрямую открытой таблице символ доллара или фунта или еще какой-нибудь деньги (шекеля к примеру) вместо ожидаемых 00:00
23 ноя 04, 15:33    [1129401]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
не шарк
Guest
Rivkin Dmitry
...А при применении типа денег, как то не очень приятно видеть в напрямую открытой таблице символ доллара или фунта или еще какой-нибудь деньги (шекеля к примеру) вместо ожидаемых 00:00

А не пробовали в денежном типе РУЧКАМИ вбить в формат поля таблицы hh:nn:ss ? Сильно помогает от шекелей. (но мешает вбивать больше 24 часов) (жаль нет смешанных форматов).


Единственный сущ-й вопрос - об арифметике в дробной части. Если она "целочисленная" и для поля типа "дата время", для которого известно, что внутреннее представление его - "вещественное число" (формат типа данных не указан) - то нет проблем. Для currency она (арифметика) целочислена по умолчанию.
23 ноя 04, 19:18    [1130358]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Shark
Member

Откуда:
Сообщений: 2365
>Думаю, что все это - дело вкуса.
ну ну.
Первое- действительно, не надо путать тип данных и свойство формат контрола, в котором они показаны.
Второе- я устал объяснять про грабли, что 1,25+2,75 будет 3,9999999999
Если Вам это не важно, выбирайте тип в соответствии со своим вкусом :-)
Успехов в быстрой разработке отчетов и прямом просмотре таблиц:^)
24 ноя 04, 07:42    [1130870]     Ответить | Цитировать Сообщить модератору
 Re: Как просуммировать часы?  [new]
Iskander68
Member

Откуда: Королев М.О.
Сообщений: 877

Шарк, логика в применении денежного типа для выражения промежутка времени
есть. А вот как наиболее удобным образом его использовать в контексте часов
и минут?

--
Regards
Alexander Artamonov

Posted via ActualForum NNTP Server 1.1

24 ноя 04, 10:43    [1131281]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft Access Ответить