Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Расчет рабочего времени / 13 сообщений из 13, страница 1 из 1
04.06.2013, 11:41
    #38284896
Smesh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет рабочего времени
Добрый день.

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

Пример
'2013-05-17 17:06:00' - '2013-05-18 15:14:00' должны получить ~ 9 часов
...
Рейтинг: 0 / 0
04.06.2013, 12:27
    #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
04.06.2013, 12:50
    #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
04.06.2013, 13:01
    #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
04.06.2013, 13:18
    #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
04.06.2013, 22:10
    #38285844
Smesh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет рабочего времени
Lonepsycho,

Спасибо огромное. Работает)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
14.11.2014, 02:09
    #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
14.11.2014, 02:10
    #38805631
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет рабочего времени
опечатка Дата до = 2014-11-14 04:00:00
...
Рейтинг: 0 / 0
14.11.2014, 02:29
    #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
14.11.2014, 02:30
    #38805637
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет рабочего времени
Теперь еще надо обед с 12:00 по 12:45 исключить из рабочего времени...
...
Рейтинг: 0 / 0
14.11.2014, 02:43
    #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
Период между сообщениями больше года.
06.04.2016, 09:29
    #39208960
andrew_che
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет рабочего времени
Здравствуйте.
А как сделать такой же функционал, но дату начала работы и окончания брать из ячеек date_begin и date_end.
Спасибо.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
19.10.2018, 15:36
    #39720026
ZiB
ZiB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет рабочего времени
andrew_che,

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


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