Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
ооооу
Guest |
Есть столбцы "дата и время начала", "дата и время конца". Надо посчитать сколько прошло минут рабочего времени от начала до конца. Рабочее время - с понедельника по пятницу с 9:00 до 18:00. Как это сделать? |
9 авг 12, 14:19 [12987934] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11562 |
datediff(mi, ... |
9 авг 12, 14:36 [12988066] Ответить | Цитировать Сообщить модератору |
ооооу
Guest |
Так посчитается разница в календарном времени А как посчитать разницу в рабочем? |
||
9 авг 12, 14:46 [12988148] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11562 |
так у вас же есть начальная и конечная дата, вот и сравнивайте их |
9 авг 12, 14:47 [12988162] Ответить | Цитировать Сообщить модератору |
ооооу
Guest |
Совсем непонятно Можно пример кода? |
||
9 авг 12, 14:49 [12988177] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11562 |
select DATEDIFF(mi, '19000101 09:00:00', '19000101 18:00:00') |
9 авг 12, 14:49 [12988179] Ответить | Цитировать Сообщить модератору |
ооооу
Guest |
Konst_One, прочитайте, пожалуйста, ещё раз мой первый пост. Нужно посчитать сколько прошло РАБОЧЕГО времени. Рабочее время - с понедельника по пятницу с 9:00 до 18:00. То, что предлагаете Вы - календарное. |
||
9 авг 12, 14:52 [12988191] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11562 |
вы бы хоть пост оформили тогда подробней, а то не понятно, что же вы хотите. скрипты таблиц входные данные выходные данные |
9 авг 12, 14:55 [12988211] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31779 |
|
||
9 авг 12, 14:57 [12988226] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31779 |
|
||
9 авг 12, 14:59 [12988237] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11562 |
=) да уж, почему минуты то? и причём тут рабочее время 9:00-18:00? проработал то он меньше. у ТС видимо чт-то другое на уме |
9 авг 12, 15:02 [12988262] Ответить | Цитировать Сообщить модератору |
ооооу
Guest |
Не надо никого путать :) alexeyvg всё правильно написал: "Да понятно - человек поступил на работу 1 мая 1960 года, уволился сегодня. Сколько минут он проработал? " Надо написать что-то типа "Подсчета рабочих дней в периоде" из FAQ: https://www.sql.ru/faq/faq_topic.aspx?fid=488 Может, у кого готовый вариант уже есть? :) |
||
9 авг 12, 15:13 [12988350] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10234 Блог |
а праздники? а отпуск, а больничный, а рабочие субботы из-за переносов праздников? или "он" с 1 мая 1960 строго работал с ПН по ПТ с 09:00 до 18:00? Он БОТ? |
||||
9 авг 12, 15:16 [12988380] Ответить | Цитировать Сообщить модератору |
ооооу
Guest |
По условию задачи "Рабочее время" - с понедельника по пятницу с 9:00 до 18:00 Праздники и т.п. учитывать не надо. |
||||
9 авг 12, 15:20 [12988419] Ответить | Цитировать Сообщить модератору |
Читатель неместный
Guest |
select datediff(mi,'9:00','18:00') * 5 очень даже и легко |
9 авг 12, 15:24 [12988454] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31779 |
Хотя всё равно придётся переделать на календарь, потому что "Праздники и т.п." учитывать придётся. Если конечно это не курсовик или тестовое задание. |
||
9 авг 12, 15:26 [12988475] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31779 |
|
||
9 авг 12, 15:27 [12988491] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Разницу в днях между датами поделить на 7. Целую часть умножить на 40, из дробную часть выкинуть воскресенье и субботу |
||
9 авг 12, 15:29 [12988514] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
ооооу
Guest |
спасибо огромное, но забыл указать что SQL Server 2000 так не прокатит :( |
||
9 авг 12, 15:42 [12988651] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10234 Блог |
наврал я в том запросе, надо так: 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] Ответить | Цитировать Сообщить модератору |
ооооу
Guest |
я не знаю как это сделать помогите, пожалуйста |
||
9 авг 12, 16:02 [12988827] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10234 Блог |
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] Ответить | Цитировать Сообщить модератору |
ооооу
Guest |
спасибо !!!!! |
||||
9 авг 12, 16:09 [12988915] Ответить | Цитировать Сообщить модератору |
ооооу
Guest |
всё таки неправильно считается :( например, для: select @dt_start = '20120810 10:00', @dt_finish = '20120810 11:00' возвращает 480 не могу найти ошибку :( |
||||
10 авг 12, 10:55 [12992196] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |