Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 как учесть рабочее время  [new]
ооооу
Guest
Есть столбцы "дата и время начала", "дата и время конца".
Надо посчитать сколько прошло минут рабочего времени от начала до конца.
Рабочее время - с понедельника по пятницу с 9:00 до 18:00.
Как это сделать?
9 авг 12, 14:19    [12987934]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
Konst_One
Member

Откуда:
Сообщений: 11562
datediff(mi, ...
9 авг 12, 14:36    [12988066]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
ооооу
Guest
Konst_One
datediff(mi, ...

Так посчитается разница в календарном времени
А как посчитать разницу в рабочем?
9 авг 12, 14:46    [12988148]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
Konst_One
Member

Откуда:
Сообщений: 11562
так у вас же есть начальная и конечная дата, вот и сравнивайте их
9 авг 12, 14:47    [12988162]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
ооооу
Guest
Konst_One
так у вас же есть начальная и конечная дата, вот и сравнивайте их

Совсем непонятно
Можно пример кода?
9 авг 12, 14:49    [12988177]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
Konst_One
Member

Откуда:
Сообщений: 11562
select DATEDIFF(mi, '19000101 09:00:00', '19000101 18:00:00')
9 авг 12, 14:49    [12988179]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
ооооу
Guest
Konst_One
select DATEDIFF(mi, '19000101 09:00:00', '19000101 18:00:00')



Konst_One, прочитайте, пожалуйста, ещё раз мой первый пост.
Нужно посчитать сколько прошло РАБОЧЕГО времени.
Рабочее время - с понедельника по пятницу с 9:00 до 18:00.
То, что предлагаете Вы - календарное.
9 авг 12, 14:52    [12988191]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
Konst_One
Member

Откуда:
Сообщений: 11562
вы бы хоть пост оформили тогда подробней, а то не понятно, что же вы хотите.

скрипты таблиц
входные данные
выходные данные
9 авг 12, 14:55    [12988211]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31779
ооооу
Есть столбцы "дата и время начала", "дата и время конца".
Надо посчитать сколько прошло минут рабочего времени от начала до конца.
Рабочее время - с понедельника по пятницу с 9:00 до 18:00.
Как это сделать?
Лучьше всего использовать таблицу-календарь. Тогда и запрос получится простой, и концептуально это правильно.
9 авг 12, 14:57    [12988226]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31779
Konst_One
вы бы хоть пост оформили тогда подробней, а то не понятно, что же вы хотите.

скрипты таблиц
входные данные
выходные данные
Да понятно - человек поступил на работу 1 мая 1960 года, уволился сегодня. Сколько минут он проработал?
9 авг 12, 14:59    [12988237]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
Konst_One
Member

Откуда:
Сообщений: 11562
=)
да уж, почему минуты то? и причём тут рабочее время 9:00-18:00? проработал то он меньше. у ТС видимо чт-то другое на уме
9 авг 12, 15:02    [12988262]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
ооооу
Guest
Konst_One
=)
да уж, почему минуты то? и причём тут рабочее время 9:00-18:00? проработал то он меньше. у ТС видимо чт-то другое на уме


Не надо никого путать :)
alexeyvg всё правильно написал: "Да понятно - человек поступил на работу 1 мая 1960 года, уволился сегодня. Сколько минут он проработал? "
Надо написать что-то типа "Подсчета рабочих дней в периоде" из FAQ: https://www.sql.ru/faq/faq_topic.aspx?fid=488
Может, у кого готовый вариант уже есть? :)
9 авг 12, 15:13    [12988350]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
ооооу
Konst_One
=)
да уж, почему минуты то? и причём тут рабочее время 9:00-18:00? проработал то он меньше. у ТС видимо чт-то другое на уме


Не надо никого путать :)
alexeyvg всё правильно написал: "Да понятно - человек поступил на работу 1 мая 1960 года, уволился сегодня. Сколько минут он проработал? "
Надо написать что-то типа "Подсчета рабочих дней в периоде" из FAQ: https://www.sql.ru/faq/faq_topic.aspx?fid=488
Может, у кого готовый вариант уже есть? :)


а праздники? а отпуск, а больничный, а рабочие субботы из-за переносов праздников? или "он" с 1 мая 1960 строго работал с ПН по ПТ с 09:00 до 18:00? Он БОТ?
9 авг 12, 15:16    [12988380]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
ооооу
Guest
Knyazev Alexey
ооооу
пропущено...


Не надо никого путать :)
alexeyvg всё правильно написал: "Да понятно - человек поступил на работу 1 мая 1960 года, уволился сегодня. Сколько минут он проработал? "
Надо написать что-то типа "Подсчета рабочих дней в периоде" из FAQ: https://www.sql.ru/faq/faq_topic.aspx?fid=488
Может, у кого готовый вариант уже есть? :)


а праздники? а отпуск, а больничный, а рабочие субботы из-за переносов праздников? или "он" с 1 мая 1960 строго работал с ПН по ПТ с 09:00 до 18:00? Он БОТ?


По условию задачи "Рабочее время" - с понедельника по пятницу с 9:00 до 18:00
Праздники и т.п. учитывать не надо.
9 авг 12, 15:20    [12988419]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
Читатель неместный
Guest
select datediff(mi,'9:00','18:00') * 5
очень даже и легко
9 авг 12, 15:24    [12988454]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31779
ооооу
По условию задачи "Рабочее время" - с понедельника по пятницу с 9:00 до 18:00
Праздники и т.п. учитывать не надо.
Ну тогда вместо таблицы календаря можно взять таблицу с номерами.

Хотя всё равно придётся переделать на календарь, потому что "Праздники и т.п." учитывать придётся. Если конечно это не курсовик или тестовое задание.
9 авг 12, 15:26    [12988475]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31779
Knyazev Alexey
"он" с 1 мая 1960 строго работал с ПН по ПТ с 09:00 до 18:00? Он БОТ?
Он сервер, но не 24х7, а 8х5 :-)
9 авг 12, 15:27    [12988491]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
Glory
Member

Откуда:
Сообщений: 104760
ооооу
Может, у кого готовый вариант уже есть? :)

Разницу в днях между датами поделить на 7. Целую часть умножить на 40, из дробную часть выкинуть воскресенье и субботу
9 авг 12, 15:29    [12988514]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
тупо...в лоб...

declare @dt_start  datetime = '20120101'
      , @dt_finish datetime = '20121101';

with cte
as
(
select cast( @dt_start as date ) dt
union all
select dateadd ( d, 1, dt ) dt from cte
where dt < cast(  @dt_finish + 1 as date )
)
select sum( mi ) sum_mi
from
(
select dt
, case when @dt_start > dt 
       then case when datediff( mi, dt, '20120809 18:00' ) < 0 then 0
            else datediff( mi, dt, '20120809 18:00' ) end
            - case when datediff( mi, dt, '20120809 09:00' ) < 0 then 0 
            else datediff( mi, dt, '20120809 09:00' )
            end
       when @dt_finish < dt 
       then case when datediff( mi, @dt_finish, '20120809 18:00' ) < 0 then 0
            else datediff( mi, @dt_finish, '20120809 18:00' ) end
            - case when datediff( mi, @dt_finish, '20120809 09:00' ) < 0 then 0 
            else datediff( mi, @dt_finish, '20120809 09:00' )
            end
  else 540           
  end as [mi]
from cte
where datediff( d, 0, dt )%7 < 5
) t
option ( maxrecursion 0 )
9 авг 12, 15:35    [12988583]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
ооооу
Guest
Knyazev Alexey
тупо...в лоб...

declare @dt_start  datetime = '20120101'
      , @dt_finish datetime = '20121101';

with cte
as
(
select cast( @dt_start as date ) dt
union all
select dateadd ( d, 1, dt ) dt from cte
where dt < cast(  @dt_finish + 1 as date )
)
select sum( mi ) sum_mi
from
(
select dt
, case when @dt_start > dt 
       then case when datediff( mi, dt, '20120809 18:00' ) < 0 then 0
            else datediff( mi, dt, '20120809 18:00' ) end
            - case when datediff( mi, dt, '20120809 09:00' ) < 0 then 0 
            else datediff( mi, dt, '20120809 09:00' )
            end
       when @dt_finish < dt 
       then case when datediff( mi, @dt_finish, '20120809 18:00' ) < 0 then 0
            else datediff( mi, @dt_finish, '20120809 18:00' ) end
            - case when datediff( mi, @dt_finish, '20120809 09:00' ) < 0 then 0 
            else datediff( mi, @dt_finish, '20120809 09:00' )
            end
  else 540           
  end as [mi]
from cte
where datediff( d, 0, dt )%7 < 5
) t
option ( maxrecursion 0 )


спасибо огромное, но забыл указать что SQL Server 2000
так не прокатит :(
9 авг 12, 15:42    [12988651]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
ооооу
спасибо огромное, но забыл указать что SQL Server 2000
так не прокатит :(


наврал я в том запросе, надо так:

declare @dt_start  datetime = '20120808 15:00'
      , @dt_finish datetime = '20120810 17:00';

with cte
as
(
select cast( @dt_start as date ) dt
union all
select dateadd ( d, 1, dt ) dt from cte
where dt <= cast(  @dt_finish as date )
)
select dt
, case when @dt_start > dt 
       then case when datediff( mi, @dt_start, dateadd( hh, 18, cast( dt as datetime ) ) ) < 0 then 0
            else datediff( mi, @dt_start, dateadd( hh, 18, cast( dt as datetime ) ) ) end
            - case when datediff( mi, @dt_start, dateadd( hh, 9, cast( dt as datetime ) ) ) < 0 then 0 
            else datediff( mi, @dt_start, dateadd( hh, 9, cast( dt as datetime ) ) )
            end
       when cast( @dt_finish as date ) = dt 
       then case when datediff( mi, dateadd( hh, 09, cast( dt as datetime ) ), @dt_finish ) < 0 then 0
            else datediff( mi, dateadd( hh, 09, cast( dt as datetime ) ), @dt_finish ) end
            - case when datediff( mi, dateadd( hh, 19, cast( dt as datetime ) ), @dt_finish ) < 0 then 0 
            else datediff( mi, dateadd( hh, 18, cast( dt as datetime ) ), @dt_finish )
            end
  else 540           
  end as [mi]
from cte
where datediff( d, 0, dt )%7 < 5
option ( maxrecursion 0 )


но его и под 2000ый легко подправить, если у вас есть справочник чисел от 1 до N
9 авг 12, 15:55    [12988757]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
ооооу
Guest
Knyazev Alexey
но его и под 2000ый легко подправить, если у вас есть справочник чисел от 1 до N

я не знаю как это сделать
помогите, пожалуйста
9 авг 12, 16:02    [12988827]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
ооооу
Knyazev Alexey
но его и под 2000ый легко подправить, если у вас есть справочник чисел от 1 до N

я не знаю как это сделать
помогите, пожалуйста


declare @dt_start  datetime
      , @dt_finish datetime

select @dt_start = '20120808 15:00', @dt_finish = '20120810 17:00'

select sum( mi ) sum_mi
from
(
select * 
, case when @dt_start > dt 
       then case when datediff( mi, @dt_start, dateadd( hh, 18, dt ) ) < 0 then 0
            else datediff( mi, @dt_start, dateadd( hh, 18, dt ) ) end
            - case when datediff( mi, @dt_start, dateadd( hh, 9, dt ) ) < 0 then 0 
            else datediff( mi, @dt_start, dateadd( hh, 9, dt ) )
            end
       when dateadd( d, datediff( d, 0, @dt_finish ), 0 ) = dt 
       then case when datediff( mi, dateadd( hh, 09, dt ), @dt_finish ) < 0 then 0
            else datediff( mi, dateadd( hh, 09, dt ), @dt_finish ) end
            - case when datediff( mi, dateadd( hh, 19, dt ), @dt_finish ) < 0 then 0 
            else datediff( mi, dateadd( hh, 18, dt ), @dt_finish )
            end
  else 540           
  end as [mi]
from
(
select dateadd( d, number, dateadd( d, datediff( d, 0, @dt_start ), 0 ) ) dt
from master..spt_values
where type = 'P'
) t
where dt <= dateadd( d, datediff( d, 0, @dt_finish ), 0 ) 
and datediff( d, 0, dt )%7 < 5
) t
9 авг 12, 16:03    [12988844]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
ооооу
Guest
Knyazev Alexey
ооооу
пропущено...

я не знаю как это сделать
помогите, пожалуйста


declare @dt_start  datetime
      , @dt_finish datetime

select @dt_start = '20120808 15:00', @dt_finish = '20120810 17:00'

select sum( mi ) sum_mi
from
(
select * 
, case when @dt_start > dt 
       then case when datediff( mi, @dt_start, dateadd( hh, 18, dt ) ) < 0 then 0
            else datediff( mi, @dt_start, dateadd( hh, 18, dt ) ) end
            - case when datediff( mi, @dt_start, dateadd( hh, 9, dt ) ) < 0 then 0 
            else datediff( mi, @dt_start, dateadd( hh, 9, dt ) )
            end
       when dateadd( d, datediff( d, 0, @dt_finish ), 0 ) = dt 
       then case when datediff( mi, dateadd( hh, 09, dt ), @dt_finish ) < 0 then 0
            else datediff( mi, dateadd( hh, 09, dt ), @dt_finish ) end
            - case when datediff( mi, dateadd( hh, 19, dt ), @dt_finish ) < 0 then 0 
            else datediff( mi, dateadd( hh, 18, dt ), @dt_finish )
            end
  else 540           
  end as [mi]
from
(
select dateadd( d, number, dateadd( d, datediff( d, 0, @dt_start ), 0 ) ) dt
from master..spt_values
where type = 'P'
) t
where dt <= dateadd( d, datediff( d, 0, @dt_finish ), 0 ) 
and datediff( d, 0, dt )%7 < 5
) t



спасибо !!!!!
9 авг 12, 16:09    [12988915]     Ответить | Цитировать Сообщить модератору
 Re: как учесть рабочее время  [new]
ооооу
Guest
Knyazev Alexey
ооооу
пропущено...

я не знаю как это сделать
помогите, пожалуйста


declare @dt_start  datetime
      , @dt_finish datetime

select @dt_start = '20120808 15:00', @dt_finish = '20120810 17:00'

select sum( mi ) sum_mi
from
(
select * 
, case when @dt_start > dt 
       then case when datediff( mi, @dt_start, dateadd( hh, 18, dt ) ) < 0 then 0
            else datediff( mi, @dt_start, dateadd( hh, 18, dt ) ) end
            - case when datediff( mi, @dt_start, dateadd( hh, 9, dt ) ) < 0 then 0 
            else datediff( mi, @dt_start, dateadd( hh, 9, dt ) )
            end
       when dateadd( d, datediff( d, 0, @dt_finish ), 0 ) = dt 
       then case when datediff( mi, dateadd( hh, 09, dt ), @dt_finish ) < 0 then 0
            else datediff( mi, dateadd( hh, 09, dt ), @dt_finish ) end
            - case when datediff( mi, dateadd( hh, 19, dt ), @dt_finish ) < 0 then 0 
            else datediff( mi, dateadd( hh, 18, dt ), @dt_finish )
            end
  else 540           
  end as [mi]
from
(
select dateadd( d, number, dateadd( d, datediff( d, 0, @dt_start ), 0 ) ) dt
from master..spt_values
where type = 'P'
) t
where dt <= dateadd( d, datediff( d, 0, @dt_finish ), 0 ) 
and datediff( d, 0, dt )%7 < 5
) t


всё таки неправильно считается :(
например, для:
select @dt_start = '20120810 10:00', @dt_finish = '20120810 11:00'
возвращает 480
не могу найти ошибку :(
10 авг 12, 10:55    [12992196]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить