powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Расчет рабочего времени
13 сообщений из 13, страница 1 из 1
Расчет рабочего времени
    #38284896
Smesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Есть задача: рассчитать рабочее время в часах между двумя датами.
Рабочими часами считаются час с 9:00 до 19:00.
Также нужно выкинуть из рабочего времени выходные дни.
Праздники трогать не нужно.

Пример
'2013-05-17 17:06:00' - '2013-05-18 15:14:00' должны получить ~ 9 часов
...
Рейтинг: 0 / 0
Расчет рабочего времени
    #38284975
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Smesh,

не то?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT sum(
  least(t + INTERVAL '19 hours', '2013-05-18 15:14:00'::TIMESTAMP) - -- vremya do
  greatest(t + INTERVAL '9 hours', '2013-05-17 17:06:00'::TIMESTAMP) -- vremya ot
  ) AS work_time
FROM
  generate_series(
      '2013-05-17 00:00:00'::TIMESTAMP, 
      '2013-05-18 00:00:00'::TIMESTAMP,
      '24 hours'::INTERVAL) AS t;



work_time
08:08:00
...
Рейтинг: 0 / 0
Расчет рабочего времени
    #38285021
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Smesh,

P.S. забыл про викенды

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT 
  sum(
  CASE 
    WHEN EXTRACT (dow FROM t) IN (0, 6)
    THEN t + INTERVAL '0 HOURS'
    ELSE least(t + INTERVAL '19 HOURS', '2013-05-18 15:14:00'::TIMESTAMP)
  END - 
  
  CASE 
    WHEN EXTRACT (dow FROM t) IN (0, 6)
    THEN t + INTERVAL '0 HOURS'
    ELSE greatest(t + INTERVAL '9 HOURS', '2013-05-17 17:06:00'::TIMESTAMP)
  END
  ) AS work_time
FROM
  generate_series(
      '2013-05-17 00:00:00'::TIMESTAMP, 
      '2013-05-18 00:00:00'::TIMESTAMP,
      '24 hours'::INTERVAL) AS t;
...
Рейтинг: 0 / 0
Расчет рабочего времени
    #38285052
Smesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощь.

Пробую на других датах, например


Дата от = 2013-05-31 21:44:00
Дата до = 2013-06-01 11:42:00


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT 
  sum(
  CASE 
    WHEN EXTRACT (dow FROM t) IN (0, 6)
    THEN t + INTERVAL '0 HOURS'
    ELSE LEAST(t + INTERVAL '19 HOURS', '2013-06-01 11:42:00'::TIMESTAMP)
  END - 
  
  CASE 
    WHEN EXTRACT (dow FROM t) IN (0, 6)
    THEN t + INTERVAL '0 HOURS'
    ELSE GREATEST(t + INTERVAL '9 HOURS', '2013-05-31 21:44:00'::TIMESTAMP)
  END
  ) AS work_time
FROM
  generate_series(
      '2013-05-31 00:00:00'::TIMESTAMP, 
      '2013-06-01 00:00:00'::TIMESTAMP,
      '24 hours'::INTERVAL) AS t;



work_time = -02:44:00
...
Рейтинг: 0 / 0
Расчет рабочего времени
    #38285108
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Smesh,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SELECT 
  sum(
  CASE 
    WHEN EXTRACT (dow FROM t) IN (0, 6)
    THEN t + INTERVAL '0 HOURS'
    ELSE LEAST(
           t + INTERVAL '19 HOURS', 
           '2013-05-18 15:14:00'::TIMESTAMP
         )
  END - 
  
  CASE 
    WHEN EXTRACT (dow FROM t) IN (0, 6)
    THEN t + INTERVAL '0 HOURS'
    ELSE LEAST(
           GREATEST(
             t + INTERVAL '9 HOURS', 
             '2013-05-17 17:06:00'::TIMESTAMP
           ), 
           t + INTERVAL '19 HOURS')
  END
  ) AS work_time
FROM
  generate_series(
      '2013-05-17 00:00:00'::TIMESTAMP, 
      '2013-05-18 00:00:00'::TIMESTAMP,
      '24 hours'::INTERVAL) AS t;
...
Рейтинг: 0 / 0
Расчет рабочего времени
    #38285844
Smesh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lonepsycho,

Спасибо огромное. Работает)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Расчет рабочего времени
    #38805629
ZiB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZiB
Гость
LonepsychoSmesh,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SELECT 
  sum(
  CASE 
    WHEN EXTRACT (dow FROM t) IN (0, 6)
    THEN t + INTERVAL '0 HOURS'
    ELSE LEAST(
           t + INTERVAL '19 HOURS', 
           '2014-11-14 04:00:00'::TIMESTAMP
         )
  END - 
  
  CASE 
    WHEN EXTRACT (dow FROM t) IN (0, 6)
    THEN t + INTERVAL '0 HOURS'
    ELSE LEAST(
           GREATEST(
             t + INTERVAL '9 HOURS', 
             '2014-11-13 11:00:00'::TIMESTAMP
           ), 
           t + INTERVAL '19 HOURS')
  END
  ) AS work_time
FROM
  generate_series(
      '2014-11-13 00:00:00'::TIMESTAMP, 
      '2014-11-14 00:00:00'::TIMESTAMP,
      '24 hours'::INTERVAL) AS t;



Не работает когда
Дата от = 2014-11-13 11:00:00
Дата до = 2014-11-13 04:00:00
Выдает "03:00:00", хотя ожидалось "08:00:00"
...
Рейтинг: 0 / 0
Расчет рабочего времени
    #38805631
ZiB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZiB
Гость
опечатка Дата до = 2014-11-14 04:00:00
...
Рейтинг: 0 / 0
Расчет рабочего времени
    #38805636
ZiB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZiB
Гость
Работает!
Вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SELECT 
  sum(
  CASE 
    WHEN EXTRACT (dow FROM t) IN (0, 6)
    THEN t + INTERVAL '0 HOURS'
    ELSE LEAST(
           t + INTERVAL '19 HOURS', 
           GREATEST(t + INTERVAL '9 HOURS','2014-11-14 04:00:00'::TIMESTAMP)
         )
  END - 
  
  CASE 
    WHEN EXTRACT (dow FROM t) IN (0, 6)
    THEN t + INTERVAL '0 HOURS'
    ELSE LEAST(
           GREATEST(
             t + INTERVAL '9 HOURS', 
             '2014-11-13 11:00:00'::TIMESTAMP
           ), 
           t + INTERVAL '19 HOURS')
  END
  ) AS work_time
FROM
  generate_series(
      '2014-11-13 00:00:00'::TIMESTAMP, 
      '2014-11-14 00:00:00'::TIMESTAMP,
      '24 hours'::INTERVAL) AS t;
...
Рейтинг: 0 / 0
Расчет рабочего времени
    #38805637
ZiB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZiB
Гость
Теперь еще надо обед с 12:00 по 12:45 исключить из рабочего времени...
...
Рейтинг: 0 / 0
Расчет рабочего времени
    #38805641
ZiB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZiB
Гость
Работает с обедом с 12:00 по 12:45!
Вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
SELECT 
  sum(
  CASE 
    WHEN EXTRACT (dow FROM t) IN (0, 6)
    THEN t + INTERVAL '0 HOURS'
    ELSE LEAST(
           t + INTERVAL '12 HOURS', 
           GREATEST(t + INTERVAL '9 HOURS','2014-11-14 04:00:00'::TIMESTAMP)
         )
  END - 
  
  CASE 
    WHEN EXTRACT (dow FROM t) IN (0, 6)
    THEN t + INTERVAL '0 HOURS'
    ELSE LEAST(
           GREATEST(
             t + INTERVAL '9 HOURS', 
             '2014-11-13 11:00:00'::TIMESTAMP
           ), 
           t + INTERVAL '12 HOURS')
  END +

  CASE 
    WHEN EXTRACT (dow FROM t) IN (0, 6)
    THEN t + INTERVAL '0 HOURS'
    ELSE LEAST(
           t + INTERVAL '19 HOURS', 
           GREATEST(t + INTERVAL '12:45:00','2014-11-14 04:00:00'::TIMESTAMP)
         )
  END - 
  
  CASE 
    WHEN EXTRACT (dow FROM t) IN (0, 6)
    THEN t + INTERVAL '0 HOURS'
    ELSE LEAST(
           GREATEST(
             t + INTERVAL '12:45:00', 
             '2014-11-13 11:00:00'::TIMESTAMP
           ), 
           t + INTERVAL '19 HOURS')
  END
  
  ) AS work_time
FROM
  generate_series(
      '2014-11-13 00:00:00'::TIMESTAMP, 
      '2014-11-14 00:00:00'::TIMESTAMP,
      '24 hours'::INTERVAL) AS t;
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Расчет рабочего времени
    #39208960
andrew_che
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
А как сделать такой же функционал, но дату начала работы и окончания брать из ячеек date_begin и date_end.
Спасибо.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Расчет рабочего времени
    #39720026
ZiB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZiB
Гость
andrew_che,

подставь в generate_series date_begin и date_end, что из from
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Расчет рабочего времени
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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