Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Помогите получить время решения документа  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
Нужно получить время решения документа. (Рабочий день 8 часов, пятница на час короче, + празд).
Пример
номер документа №1
дата создания 29.03.2013
дата закрытия 02.04.2013


1. Как создать производственный календарь?
2. Помогите создать скрипт
3 апр 13, 11:03    [14129821]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
Гость333
Member

Откуда:
Сообщений: 3683
D_r_a_g_o_n
2. Помогите создать скрипт

Скрипт, выполняющий какие действия?
3 апр 13, 11:06    [14129849]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
Glory
Member

Откуда:
Сообщений: 104751
D_r_a_g_o_n
2. Помогите создать скрипт

Цикл на нужное количество дней в календаре с добавлением одной даты на каждом шаге
3 апр 13, 11:12    [14129902]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
создать таблицу календарь ,с полем которое указывает рабочий день или нет ,патом ее джойнить
3 апр 13, 11:14    [14129913]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
получил скрипт по выходным.


SELECT distinct
[Date],
CASE DATEDIFF(DAY,0, (DateAdd(hour,case datediff(hh, getutcdate(), getdate()) when 6 then +4 when 5 then +3 end,[Date])))%7
WHEN 0 THEN N'Понедельник'
WHEN 1 THEN N'Вторник'
WHEN 2 THEN N'Среда'
WHEN 3 THEN N'Четверг'
WHEN 4 THEN N'Пятница'
WHEN 5 THEN N'Суббота'
WHEN 6 THEN N'Воскресенье'
END day_ned,
CASE DATEDIFF(DAY,0, (DateAdd(hour,case datediff(hh, getutcdate(), getdate()) when 6 then +4 when 5 then +3 end,[Date])))%7
WHEN 0 THEN 0
WHEN 1 THEN 0
WHEN 2 THEN 0
WHEN 3 THEN 0
WHEN 4 THEN 0
WHEN 5 THEN 1
WHEN 6 THEN 1
END day
FROM (
SELECT
DATEADD( dd, [Number], DATEDIFF( dd, 0, '2013-01-01')) AS [Date]
FROM
(
SELECT [Number]
FROM master.dbo.spt_values -- For MS SQL 2000 [Number] is [0, ..., 255]
WHERE type = 'P'
UNION ALL
SELECT [Number] + 256
FROM master.dbo.spt_values
WHERE type = 'P'
) n
) d
WHERE [Date] < '2014-01-01'
order by [Date]
3 апр 13, 11:46    [14130094]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
Glory
Member

Откуда:
Сообщений: 104751
D_r_a_g_o_n
получил скрипт по выходным.

И что, там учтены все переносы выходных этого года ?
3 апр 13, 11:56    [14130160]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
в этом скрипте учтены только Суббота и Воскресенье и то могут быть рабочими.
какой следующий щаг?
3 апр 13, 12:07    [14130239]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
Glory
Member

Откуда:
Сообщений: 104751
D_r_a_g_o_n
какой следующий щаг?

Создать таблицу с каледндарем.
Заполнить ее.
Отметить в ней выходные, праздники и тп за весь заполненный период.
3 апр 13, 12:10    [14130255]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
понял, а если укороченный день, что ставить?
3 апр 13, 12:14    [14130295]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
Glory
Member

Откуда:
Сообщений: 104751
D_r_a_g_o_n
а если укороченный день, что ставить?

То, что считает правильным ваш бизнесс
3 апр 13, 12:16    [14130313]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
получил производственный календарь:
0 - рабочий день
1 - выходной
2 - укороченный день на 1 час
3 - укороченный день на 2 часа

как реализовать процедуру, которая будет с учетом календаря вычитать одну дату из другой.
Пример:
Документ № 1
Дата создания 30.03.2013
Дата закрытия 03.04.2013


Create table #kalend
( Dat datetime,
day_ned nvarchar(255),
day int
)
insert into #kalend
( Dat,
day_ned,
day
)
SELECT distinct
[Date] as Dat,
CASE DATEDIFF(DAY,0, (DateAdd(hour,case datediff(hh, getutcdate(), getdate()) when 6 then +4 when 5 then +3 end,[Date])))%7
WHEN 0 THEN N'Понедельник'
WHEN 1 THEN N'Вторник'
WHEN 2 THEN N'Среда'
WHEN 3 THEN N'Четверг'
WHEN 4 THEN N'Пятница'
WHEN 5 THEN N'Суббота'
WHEN 6 THEN N'Воскресенье'
END day_ned,
CASE DATEDIFF(DAY,0, (DateAdd(hour,case datediff(hh, getutcdate(), getdate()) when 6 then +4 when 5 then +3 end,[Date])))%7
WHEN 0 THEN ( case WHEN [Date] in ('2013-01-07','2013-11-04') -- выходной
then 1
WHEN [Date] in ('1900-01-01')-- укороченный
then 2
else 0
end
)
WHEN 1 THEN ( case WHEN [Date] in ('2013-01-01','2013-01-08') -- выходной
then 1
WHEN [Date] in ('2013-04-30','2013-12-31') -- укороченный
then 2
else 0
end
)
WHEN 2 THEN ( case WHEN [Date] in ('2013-01-02','2013-05-01','2013-06-12') -- выходной
then 1
WHEN [Date] in ('2013-05-08')-- укороченный
then 2
else 0
end
)
WHEN 3 THEN ( case WHEN [Date] in ('2013-01-03','2013-05-02','2013-05-09')
then 1
WHEN [Date] in ('2013-03-07')-- укороченный
then 2
else 0
end
)
WHEN 4 THEN ( case WHEN [Date] in ('2013-01-04','2013-03-08','2013-05-03','2013-05-10')
then 1
WHEN [Date] in ('2013-02-22')
then 3
else 2
end
)

WHEN 5 THEN ( case WHEN [Date] in ('2013-01-07') then 0 else 1 end)
WHEN 6 THEN ( case WHEN [Date] in ('2013-01-07') then 0 else 1 end)
END day
FROM (
SELECT
DATEADD( dd, [Number], DATEDIFF( dd, 0, '2013-01-01')) AS [Date]
FROM
(
SELECT [Number]
FROM master.dbo.spt_values -- For MS SQL 2000 [Number] is [0, ..., 255]
WHERE type = 'P'
UNION ALL
SELECT [Number] + 256
FROM master.dbo.spt_values
WHERE type = 'P'
) n
) d
WHERE [Date] < '2014-01-01'
order by [Date]
3 апр 13, 14:03    [14131148]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
Glory
Member

Откуда:
Сообщений: 104751
D_r_a_g_o_n
как реализовать процедуру, которая будет с учетом календаря вычитать одну дату из другой.
Пример:
Документ № 1
Дата создания 30.03.2013
Дата закрытия 03.04.2013

Просуммировать число рабочих дней в календарном периоде 30.03.2013 - 03.04.2013
3 апр 13, 14:06    [14131165]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
D_r_a_g_o_n,

а Пасха,которая "бегает" из года в год ?
Не все учитывает ваш подход
3 апр 13, 14:08    [14131177]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
Гость333
Member

Откуда:
Сообщений: 3683
D_r_a_g_o_n
0 - рабочий день
1 - выходной
2 - укороченный день на 1 час
3 - укороченный день на 2 часа

Хм... а вариант — для каждого дня хранить число рабочих часов (0, 6, 7, 8) — чем не подошёл?
3 апр 13, 14:10    [14131187]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
[quot Glory]
D_r_a_g_o_n
как реализовать процедуру, которая будет с учетом календаря вычитать одну дату из другой.
Пример:
Документ № 1
Дата создания 30.03.2013
Дата закрытия 03.04.2013

Просуммировать число рабочих дней в календарном периоде 30.03.2013 - 03.04.2013[/quot

может скрипт есть?
3 апр 13, 14:17    [14131217]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
Glory
Member

Откуда:
Сообщений: 104751
D_r_a_g_o_n
может скрипт есть?

Вы не умеете пользоваться фразой WHERE ? Или функцией COUNT ?
3 апр 13, 14:19    [14131230]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
Гость333
Member

Откуда:
Сообщений: 3683
D_r_a_g_o_n
получил производственный календарь:

Create table #kalend
( Dat datetime,
day_ned nvarchar(255),
day int
)
...

Выполнил ваш скрипт. В таблице #kalend оказалось 365 записей, во всех записях значения day_ned и day равны NULL. Так и задумано?
3 апр 13, 14:20    [14131231]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
Гость333
D_r_a_g_o_n
0 - рабочий день
1 - выходной
2 - укороченный день на 1 час
3 - укороченный день на 2 часа

Хм... а вариант — для каждого дня хранить число рабочих часов (0, 6, 7, 8) — чем не подошёл?


заменить значения не составит труда.

меня волнует как создать скрипт
например
дата 04.04.2013 14:35:00-30.03.2013 16:00:00 в итоге получить ..дней и .. мин Можно так?
3 апр 13, 14:22    [14131243]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
Гость333
Member

Откуда:
Сообщений: 3683
D_r_a_g_o_n
например
дата 04.04.2013 14:35:00-30.03.2013 16:00:00 в итоге получить ..дней и .. мин Можно так?

Ага. Уже часы с минутами появились :-)
То есть для решения задачи нужно знать "начало рабочего дня" и "конец рабочего дня"?
3 апр 13, 14:25    [14131255]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
Гость333
D_r_a_g_o_n
получил производственный календарь:

Create table #kalend
( Dat datetime,
day_ned nvarchar(255),
day int
)
...

Выполнил ваш скрипт. В таблице #kalend оказалось 365 записей, во всех записях значения day_ned и day равны NULL. Так и задумано?



нет

вот мой результат
2013-01-01 00:00:00.000 Вторник 1
2013-01-02 00:00:00.000 Среда 1
2013-01-03 00:00:00.000 Четверг 1
2013-01-04 00:00:00.000 Пятница 1
2013-01-05 00:00:00.000 Суббота 1
2013-01-06 00:00:00.000 Воскресенье 1
2013-01-07 00:00:00.000 Понедельник 1
2013-01-08 00:00:00.000 Вторник 1
2013-01-09 00:00:00.000 Среда 0
2013-01-10 00:00:00.000 Четверг 0
2013-01-11 00:00:00.000 Пятница 2
2013-01-12 00:00:00.000 Суббота 1
2013-01-13 00:00:00.000 Воскресенье 1
2013-01-14 00:00:00.000 Понедельник 0
2013-01-15 00:00:00.000 Вторник 0
3 апр 13, 14:25    [14131258]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
Гость333
D_r_a_g_o_n
например
дата 04.04.2013 14:35:00-30.03.2013 16:00:00 в итоге получить ..дней и .. мин Можно так?

Ага. Уже часы с минутами появились :-)
То есть для решения задачи нужно знать "начало рабочего дня" и "конец рабочего дня"?


например начало 8.00 конец в 17.00
3 апр 13, 14:29    [14131275]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Эээээээ... а не проще просто заполнить в экселе 365 строчек (формулами+исключения поставить ручками) и получить в итоге текст для SQL (из экселя Ctr+C/Ctrl+V):

insert into Table1 select '2013-01-01 00:00:00.000', 'Вторник', 1
insert into Table1 select '2013-01-02 00:00:00.000', 'Среда', 1
-- и таких 365 строчек
3 апр 13, 14:48    [14131379]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ambarka_max,

еще раз - проще завести нормальную таблицу календарь рабочего времени и усе
3 апр 13, 14:50    [14131393]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
ambarka_max
Эээээээ... а не проще просто заполнить в экселе 365 строчек (формулами+исключения поставить ручками) и получить в итоге текст для SQL (из экселя Ctr+C/Ctrl+V):

insert into Table1 select '2013-01-01 00:00:00.000', 'Вторник', 1
insert into Table1 select '2013-01-02 00:00:00.000', 'Среда', 1
-- и таких 365 строчек


может проще, но меня другая часть волнует
3 апр 13, 14:50    [14131394]     Ответить | Цитировать Сообщить модератору
 Re: Помогите получить время решения документа  [new]
Dima T
Member

Откуда:
Сообщений: 15851
Тут список выходных в 2013 году
3 апр 13, 15:02    [14131471]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить