Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2018, 10:11   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

попрробуйте
Код:
begin
for select
t1.user_name,
SUM((CASE
WHEN EXTRACT(HOUR FROM t1.t_start)<=8 and EXTRACT(HOUR FROM t1.t_stop)>=8
THEN CASE WHEN EXTRACT(HOUR FROM t1.t_start)<8 and EXTRACT(HOUR FROM t1.t_stop)>8 THEN CAST('09:00:00' AS TIME)-CAST('08:00:00' AS TIME)
ELSE CAST(t1.t_stop AS TIME)-CAST(t1.t_start AS TIME) END
ELSE 0
END)/60) AS Between08and09,
SUM((CASE
WHEN EXTRACT(HOUR FROM t1.t_start)<=9 and EXTRACT(HOUR FROM t1.t_stop)>=9
THEN CASE WHEN EXTRACT(HOUR FROM t1.t_start)<9 and EXTRACT(HOUR FROM t1.t_stop)>9 THEN CAST('10:00:00' AS TIME)-CAST('09:00:00' AS TIME)
WHEN EXTRACT(HOUR FROM t1.t_start)<9 THEN CAST(t1.t_stop AS TIME)-CAST('09:00:00' AS TIME)
WHEN EXTRACT(HOUR FROM t1.t_stop)>9 THEN CAST('10:00:00' AS TIME)-CAST(t1.t_start AS TIME)
ELSE CAST(t1.t_stop AS TIME)-CAST(t1.t_start AS TIME) END
ELSE 0
END)/60) AS Between09and10
....
и оставьте только
Код:
group by
u1.user_name

p.s. И, кстати, использовать для идентификации user_name это плохо.
В реале нужно обязательно иметь уникальный код сотрудника.
куда делось USER_ID ?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.03.2018, 10:12   #12
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Так, например
Код:
SELECT U.user_name, 
    SUM(U.Between08and09) AS Between08and09,...
  FROM (
    SELECT t1.user_name, CASE ... END AS Between08and09,..
      FROM ... WHERE ... ) AS U
  GROUP BY U.user_name
Можно кстати и без вложенного. там еще интервалы 0-1 и 23-0 имеют свои особенности типа начал в 23:55 и закончил в 00:10 следующего дня
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.03.2018, 10:28   #13
aford
Пользователь
 
Регистрация: 27.03.2018
Сообщений: 13
По умолчанию

Serge_Bliznykov, спасибо, работает вроде как надо
Цитата:
куда делось USER_ID ?
У меня так куча условий из других таблиц в коде, я убираю, чтобы не запутывать)
Аватар, так же спасибо за помощь, надеюсь, что вопрос закрыт)
aford вне форума Ответить с цитированием
Старый 29.03.2018, 10:52   #14
aford
Пользователь
 
Регистрация: 27.03.2018
Сообщений: 13
По умолчанию

Поспешил.. при вот таких исходных данных
Цитата:
USER_NAME T_START T_STOP STATE_ID
Сотрудни1 28.03.2018 07:55:49 28.03.2018 08:06:14 1
Сотрудни1 28.03.2018 08:22:59 28.03.2018 09:59:08 1
Сотрудни1 28.03.2018 10:15:06 28.03.2018 11:53:44 1
Сотрудни1 28.03.2018 12:01:44 28.03.2018 14:21:21 1
Сотрудни1 28.03.2018 14:39:47 28.03.2018 16:00:20 1
Самое первое значение почему-то выдает 106.58 (с 8 до 9 утра). Хотя больше 60-ти быть не может. Остальные нормально. Я сомневаюсь, что будет верным у 1-го значения вычитать 60..
aford вне форума Ответить с цитированием
Старый 29.03.2018, 10:57   #15
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Так Between08and09 не правильно формируется. Сравни с другими. Да и что будешь делать если начало в 28.03.2018 22:30:00 и конец в 29.03.2018 02:30:00 ? У тебя полный игнор таких ситуаций
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.03.2018, 11:09   #16
aford
Пользователь
 
Регистрация: 27.03.2018
Сообщений: 13
По умолчанию

Точно, поспешил, извините за тупость. Насчет времени пока еще не смотрел, нужно к условию выборки where добавить день, и начиная с 00:00 так же прибавлять день?
aford вне форума Ответить с цитированием
Старый 29.03.2018, 11:23   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Если выборка за сутки, например 28.03.2018, и такие ситуации возможны, то по идее нужно выбирать те, у которых
дата-время начала меньше 29.03.2018 00:00:00 и
дата-время конца больше 28.03.2018 00:00:00
ну и понятно, что должно быть не меньше даты-времени начала (а вдруг)
в общем-то и расчет интервалов сильно поменяется, и делать нужно как разницу времени с учетом даты
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.03.2018, 11:46   #18
aford
Пользователь
 
Регистрация: 27.03.2018
Сообщений: 13
По умолчанию

Мне нужна выборка за сутки с 08:00 до 08:00 следующего дня. Значит в условии
Where t_start > 28.03.2018 07:00:00 (на случай, если пришел раньше) и
t_stop < 29.03.2018 09:00:00 (если закончил позже)
Цитата:
делать нужно как разницу времени с учетом даты
т.е. все, что было выше, нужно переделать? Мы вычитали и работали с часами, как тогда преобразовать CAST('09:00:00' AS TIME) в текущую дату со временем 09:00?
aford вне форума Ответить с цитированием
Старый 29.03.2018, 12:21   #19
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Я бы делал примерно так
Код:
Where t_start < '2018-03-29 08:00:00' and t_stop > '2018-03-28 08:00:00'
и
Код:
    CASE WHEN T_START <= '2018-03-28 13:00:00' AND T_STOP > '2018-03-28 12:00:00'
         THEN CASE WHEN T_START < '2018-03-28 12:00:00' AND T_STOP > '2018-03-28 13:00:00' THEN CAST('13:00:00' AS TIME)-CAST('12:00:00' AS TIME)
                   WHEN T_START < '2018-03-28 12:00:00' THEN CAST(T_STOP AS TIME)-CAST('12:00:00' AS TIME)
                   WHEN T_STOP > '2018-03-28 13:00:00' THEN CAST('13:00:00' AS TIME)-CAST(T_START AS TIME)
                   ELSE CAST(T_STOP AS TIME)-CAST(T_START AS TIME) END
         ELSE 0 END AS Between12and13,
для интервалов после полуночи дата 2018-03-29 само собой
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 29.03.2018 в 12:24.
Аватар вне форума Ответить с цитированием
Старый 29.03.2018, 12:56   #20
aford
Пользователь
 
Регистрация: 27.03.2018
Сообщений: 13
По умолчанию

Условие Where добавил вроде правильно:
Код:
           cast(t1.t_start as timestamp) < DATEADD(8 HOUR TO DATEADD(1 DAY TO :D)) and
           cast(t1.t_stop as timestamp) > DATEADD(8 HOUR TO :D)
А вот с выборкой снова проблемы, вот так вот выводит 0 с 8 до 9 утра:
Код:
CASE WHEN T1.T_START <= DATEADD(9 HOUR TO :D) AND T1.T_STOP > DATEADD(8 HOUR TO :D)
         THEN CASE WHEN T1.T_START < DATEADD(8 HOUR TO :D) AND T1.T_STOP > DATEADD(9 HOUR TO :D) THEN CAST('09:00:00' AS TIME)-CAST('08:00:00' AS TIME)
                   WHEN T1.T_START < DATEADD(8 HOUR TO :D) THEN CAST(T1.T_STOP AS TIME)-CAST('08:00:00' AS TIME)
                   WHEN T1.T_STOP > DATEADD(9 HOUR TO :D) THEN CAST('09:00:00' AS TIME)-CAST(T1.T_START AS TIME)
                   ELSE CAST(T1.T_STOP AS TIME)-CAST(T1.T_START AS TIME) END
         ELSE 0 END AS Between08and09,

Последний раз редактировалось aford; 29.03.2018 в 13:00.
aford вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа калькулятора выполняющего вычисление среднего значения логарифмов вводимых чисел и величины снеднеквадратического отклонения Andreibond Помощь студентам 1 22.12.2016 20:21
Вычисление среднего значения Fil_1990 C# (си шарп) 13 08.10.2015 16:11
Вычисление среднего значения в формате дд/мм/гг aMuratovna Microsoft Office Excel 5 05.03.2015 16:09
Вычисление среднего значения roxy7 Microsoft Office Excel 2 13.12.2011 19:41
Вычисление среднего значения из нескольких полей одной записи yellowviolet Microsoft Office Access 4 16.11.2011 22:55