Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 замена nullов логином сотрудника  [new]
Aknodl
Member

Откуда:
Сообщений: 12
Добрый день! не смог верно объяснить условие,вследствие чего не получил точный ответ.
Существуют 2 таблицы. из первой(рис.1) мне нужно запросить логины сотрудников,из второй(рис.2) почасовые datatime.При joinе 2 запросов получается результирующий запрос(рис.3) Я знаю,что если юзер был указан с 4 до 7 утра,то он работал с 20-00 предыдущего дня до 7 утра текущего,а если юзер указан вечером(17-00,18 или 19-00) то он работал с 8 до 19 часов. Задача заменить все nullы логинами юзеров,которые работали в данную смену.
Рис.1:
2017-01-10 00:00:00.000 НСС 2017-01-10 04:00:00.000 2017-01-10 04:47:51.873 tretyakov.aleksey NULL
2017-01-10 00:00:00.000 НСС 2017-01-10 16:00:00.000 2017-01-10 16:51:13.617 konstantin_sonin NULL
2017-01-11 00:00:00.000 НСС 2017-01-11 16:00:00.000 2017-01-11 16:58:33.107 Tareev_DV NULL
2017-01-11 00:00:00.000 НСС 2017-01-11 04:00:00.000 2017-01-11 04:43:55.713 vinnikov.aleksey NULL
2017-01-12 00:00:00.000 НСС 2017-01-12 04:00:00.000 2017-01-12 04:59:40.100 konstantin_sonin NULL
2017-01-12 00:00:00.000 НСС 2017-01-12 16:00:00.000 2017-01-12 16:59:13.433 tretyakov.aleksey NULL
2017-01-13 00:00:00.000 НСС 2017-01-13 17:00:00.000 2017-01-13 17:55:45.137 vinnikov.aleksey NULL
2017-01-13 00:00:00.000 НСС 2017-01-13 05:00:00.000 2017-01-13 05:07:09.510 Tareev_DV NULL
2017-01-14 00:00:00.000 НСС 2017-01-14 05:00:00.000 2017-01-14 05:31:04.060 tretyakov.aleksey NULL
2017-01-14 00:00:00.000 НСС 2017-01-14 16:00:00.000 2017-01-14 16:44:10.680 konstantin_sonin NULL
2017-01-15 00:00:00.000 НСС 2017-01-15 17:00:00.000 2017-01-15 17:02:11.007 Tareev_DV NULL
2017-01-15 00:00:00.000 НСС 2017-01-15 04:00:00.000 2017-01-15 04:57:17.093 vinnikov.aleksey NULL
Код запроса к рис.1:
DECLARE @bdt DATETIME = Cast('09.01.2017 00:40:00' AS DATETIME)
DECLARE @edt DATETIME = Cast('15.01.2017 23:59:00' AS DATETIME)
SELECT TOP (1000)

DATEADD(hour, DATEPART (HOUR, [dt]),DATEADD(DAY, 0, DATEDIFF(DAY, 0, [edit_dt]))) as dt

,[user_group]
,DATEADD(hour, DATEPART (HOUR, [edit_dt]),DATEADD(DAY, 0, DATEDIFF(DAY, 0, [edit_dt]))) as date

,[edit_dt]
,[web_user]
,[id]
FROM [dbo].[dv_signature]
--join [dbo].[CalendarHR] cal
where [user_group] = 'НСС' and dt between @bdt and @edt
order by dt
18 май 17, 09:56    [20491874]     Ответить | Цитировать Сообщить модератору
 Re: замена nullов логином сотрудника  [new]
Aknodl
Member

Откуда:
Сообщений: 12
+
Рис.2:
2017-01-09 01:00:00.000
2017-01-09 02:00:00.000
2017-01-09 03:00:00.000
2017-01-09 04:00:00.000
2017-01-09 05:00:00.000
2017-01-09 06:00:00.000
2017-01-09 07:00:00.000
2017-01-09 08:00:00.000
2017-01-09 09:00:00.000
2017-01-09 10:00:00.000
2017-01-09 11:00:00.000
2017-01-09 12:00:00.000
2017-01-09 13:00:00.000
2017-01-09 14:00:00.000
2017-01-09 15:00:00.000
2017-01-09 16:00:00.000
2017-01-09 17:00:00.000
2017-01-09 18:00:00.000
2017-01-09 19:00:00.000
2017-01-09 20:00:00.000
2017-01-09 21:00:00.000
2017-01-09 22:00:00.000
2017-01-09 23:00:00.000
2017-01-10 00:00:00.000
2017-01-10 01:00:00.000
2017-01-10 02:00:00.000
2017-01-10 03:00:00.000
2017-01-10 04:00:00.000
2017-01-10 05:00:00.000
2017-01-10 06:00:00.000
2017-01-10 07:00:00.000
2017-01-10 08:00:00.000
2017-01-10 09:00:00.000
2017-01-10 10:00:00.000
2017-01-10 11:00:00.000
2017-01-10 12:00:00.000
2017-01-10 13:00:00.000
2017-01-10 14:00:00.000
2017-01-10 15:00:00.000
2017-01-10 16:00:00.000
2017-01-10 17:00:00.000
2017-01-10 18:00:00.000
2017-01-10 19:00:00.000
2017-01-10 20:00:00.000
2017-01-10 21:00:00.000
2017-01-10 22:00:00.000
2017-01-10 23:00:00.000
2017-01-11 00:00:00.000
2017-01-11 01:00:00.000
2017-01-11 02:00:00.000
2017-01-11 03:00:00.000
2017-01-11 04:00:00.000
2017-01-11 05:00:00.000
2017-01-11 06:00:00.000
2017-01-11 07:00:00.000
2017-01-11 08:00:00.000
2017-01-11 09:00:00.000
2017-01-11 10:00:00.000
2017-01-11 11:00:00.000
2017-01-11 12:00:00.000
2017-01-11 13:00:00.000
2017-01-11 14:00:00.000
2017-01-11 15:00:00.000
2017-01-11 16:00:00.000
2017-01-11 17:00:00.000
2017-01-11 18:00:00.000
2017-01-11 19:00:00.000
2017-01-11 20:00:00.000
2017-01-11 21:00:00.000
2017-01-11 22:00:00.000
2017-01-11 23:00:00.000
Рис.3:
2017-01-08 00:00:00.000 NULL
2017-01-08 01:00:00.000 NULL
2017-01-08 02:00:00.000 NULL
2017-01-08 03:00:00.000 NULL
2017-01-08 04:00:00.000 konstantin_sonin
2017-01-08 05:00:00.000 NULL
2017-01-08 06:00:00.000 NULL
2017-01-08 07:00:00.000 NULL
2017-01-08 08:00:00.000 NULL
2017-01-08 09:00:00.000 NULL
2017-01-08 10:00:00.000 NULL
2017-01-08 11:00:00.000 NULL
2017-01-08 12:00:00.000 NULL
2017-01-08 13:00:00.000 NULL
2017-01-08 14:00:00.000 NULL
2017-01-08 15:00:00.000 NULL
2017-01-08 16:00:00.000 NULL
2017-01-08 17:00:00.000 tretyakov.aleksey
2017-01-08 18:00:00.000 NULL
2017-01-08 19:00:00.000 NULL
2017-01-08 20:00:00.000 NULL
2017-01-08 21:00:00.000 NULL
2017-01-08 22:00:00.000 NULL
2017-01-08 23:00:00.000 NULL
2017-01-09 00:00:00.000 NULL
2017-01-09 01:00:00.000 NULL
2017-01-09 02:00:00.000 NULL
2017-01-09 03:00:00.000 NULL
2017-01-09 04:00:00.000 NULL
2017-01-09 05:00:00.000 Tareev_DV
2017-01-09 06:00:00.000 NULL
2017-01-09 07:00:00.000 NULL
2017-01-09 08:00:00.000 NULL
2017-01-09 09:00:00.000 NULL
2017-01-09 10:00:00.000 NULL
2017-01-09 11:00:00.000 NULL
2017-01-09 12:00:00.000 NULL
2017-01-09 13:00:00.000 NULL
2017-01-09 14:00:00.000 NULL
2017-01-09 15:00:00.000 NULL
2017-01-09 16:00:00.000 NULL
2017-01-09 17:00:00.000 vinnikov.aleksey
2017-01-09 18:00:00.000 NULL
2017-01-09 19:00:00.000 NULL
2017-01-09 20:00:00.000 NULL
2017-01-09 21:00:00.000 NULL
2017-01-09 22:00:00.000 NULL
2017-01-09 23:00:00.000 NULL
2017-01-10 00:00:00.000 NULL
2017-01-10 01:00:00.000 NULL
2017-01-10 02:00:00.000 NULL
2017-01-10 03:00:00.000 NULL
2017-01-10 04:00:00.000 tretyakov.aleksey
2017-01-10 05:00:00.000 NULL
2017-01-10 06:00:00.000 NULL
2017-01-10 07:00:00.000 NULL
2017-01-10 08:00:00.000 NULL
2017-01-10 09:00:00.000 NULL
2017-01-10 10:00:00.000 NULL
2017-01-10 11:00:00.000 NULL
2017-01-10 12:00:00.000 NULL
2017-01-10 13:00:00.000 NULL
2017-01-10 14:00:00.000 NULL
2017-01-10 15:00:00.000 NULL
2017-01-10 16:00:00.000 konstantin_sonin
2017-01-10 17:00:00.000 NULL
2017-01-10 18:00:00.000 NULL
2017-01-10 19:00:00.000 NULL
2017-01-10 20:00:00.000 NULL
2017-01-10 21:00:00.000 NULL
2017-01-10 22:00:00.000 NULL
2017-01-10 23:00:00.000 NULL
Код запроса:
DECLARE @bdt DATETIME = Cast('08.01.2017 00:00:00' AS DATETIME)
DECLARE @edt DATETIME = Cast('10.01.2017 23:59:00' AS DATETIME)



select cal.dt
,[web_user]

--,IIF(datepart(hh,tb.dt)<=12,'AM','PM') as ap
from
(SELECT TOP (1000) [am/pm]

,[dt]
,[user_group]
,DATEADD(hour, DATEPART (HOUR, [edit_dt]),DATEADD(DAY, 0, DATEDIFF(DAY, 0, [edit_dt]))) as date
,datepart(hh,[edit_dt]) as dt2
,[edit_dt]
,[web_user]
,[id]

FROM [dbo].[dv_signature]
--join [dbo].[CalendarHR] cal

where dt between @bdt and @edt and[user_group] = 'НСС') tb
right join [dbo].[CalendarHR] cal on tb.date = cal.dt
where cal.dt between @bdt and @edt


Сообщение было отредактировано: 18 май 17, 13:08
18 май 17, 09:57    [20491881]     Ответить | Цитировать Сообщить модератору
 Re: замена nullов логином сотрудника  [new]
iiyama
Member

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

1. Пожалуйста, оформляйте код тегами SRC
2. Поскольку скриптов предоставлено не было, то я (по мотивам придумал задачу сам, надеюсь попал)
declare @UserLog table (logdate datetime, username nvarchar(50))
insert into @UserLog values('20170101 04:46:12','ivanoff'),('20170102 14:06:34','petroff'),('20170103 19:01:12','sidoroff') 

;with UserWorkTime
AS
(
select 
	username 
	, CASE 
		--с 4 до 7 утра,то он работал с 20-00 предыдущего дня 
		WHEN DATEPART(hh,logdate) BETWEEN 4 AND 7 THEN DATEADD(hh,20,DATEADD(dd,-1,CAST(CAST(logdate as date) as datetime) ))
		--если юзер указан вечером(17-00,18 или 19-00) то он работал с 8 
		WHEN DATEPART(hh,logdate) BETWEEN 17 AND 19 THEN DATEADD(hh,7, CAST(CAST(logdate as date) as datetime))
		ELSE NULL
	  END StartDateTime
	, CASE 
		----с 4 до 7 утра,то он работал  до 7 утра текущего
		WHEN DATEPART(hh,logdate) BETWEEN 4 AND 7 THEN DATEADD(hh,7,CAST(CAST(logdate as date) as datetime) )
		--если юзер указан вечером(17-00,18 или 19-00)  до 19 часов
		WHEN DATEPART(hh,logdate) BETWEEN 17 AND 19 THEN DATEADD(hh,19, CAST(CAST(logdate as date) as datetime))
		ELSE NULL
	  END StopDateTime
   
from @UserLog
)

select WT.username, C.CalendarDateTime 
from UserWorkTime WT
	join Calendar C ON C.CalendarDateTime between WT.StartDateTime AND WT.StopDateTime
order by C.CalendarDateTime, WT.username
18 май 17, 10:51    [20492140]     Ответить | Цитировать Сообщить модератору
 Re: замена nullов логином сотрудника  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
iiyama
2. Поскольку скриптов предоставлено не было, то я (по мотивам придумал задачу сам, надеюсь попал)

Я ему задачу в соседней теме уже решил. При чем и эту тоже.
Просто эта ленивая скотина не хочет ни на йоту напрячь свое серое вещество, предпочитая напрягать нас.
18 май 17, 11:41    [20492360]     Ответить | Цитировать Сообщить модератору
 Re: замена nullов логином сотрудника  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
Модератор: Прекращайте плодить топики
18 май 17, 13:08    [20492671]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить