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

Откуда: из России
Сообщений: 887
Пишу запрос для УРВ:
select a.CARDNUMBER ,a.name1,
--a.name2,a.name3, 
date_enter, date_Exit,cast((date_exit-date_enter) as varchar) as WorkingTime
from 
((select min(MESSDATETIME) date_enter ,READERNAME,
CARDNUMBER,
NAME1,NAME2,Name3  from dbo.Times_events
where READERType=1 and MESSDATETIME>'20090701 00:00:00'
group by datediff(dd,0,MESSDATETIME),NAME1,NAME2,CARDNUMBER,Name3,READERNAME) as a
full join  
   (select Max(MESSDATETIME) date_exit,READERNAME,
    CARDNUMBER,
    NAME1,NAME2,Name3
    from dbo.Times_events
    where READERType=2  and MESSDATETIME>'20090701 00:00:00'
    group by datediff(dd,0,MESSDATETIME),NAME1,NAME2,CARDNUMBER,Name3,READERNAME ) as b

on a.CARDNUMBER=b.CARDNUMBER and datediff(dd,0,date_enter)=datediff(dd,0,date_Exit))
order by a.name1, date_enter
 
Как избавиться от такого:
CardNumber name1 date_enter date_exit workingTime
NULL NULL NULL 2009-07-20 19:01:22.000 NULL
13156488 Абрютин 2009-07-01 09:25:10.000 NULL NULL
т.е заполнить номера пропусков, имя, т.е в зависимости где пусто подставлять a.CARDNUMBER или
b.CARDNUMBER и т.д. можно попробовать через переменную, а без неё как.
14 июл 09, 12:58    [7412913]     Ответить | Цитировать Сообщить модератору
 Re: Пустыйе значения строк при full join.  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Slava_Nik
в зависимости где пусто подставлять a.CARDNUMBER или b.CARDNUMBER
ISNULL(a.CARDNUMBER, b.CARDNUMBER)
?
14 июл 09, 13:01    [7412936]     Ответить | Цитировать Сообщить модератору
 Re: Пустыйе значения строк при full join.  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
А так не годится:
SELECT
 CARDNUMBER,
 name1,
 MIN(CASE READERType WHEN 1 THEN MESSDATETIME ELSE '99991231' END)date_enter,
 MAX(CASE READERType WHEN 2 THEN MESSDATETIME END)date_exit,
 CAST(MAX(CASE READERType WHEN 2 THEN MESSDATETIME END)-MIN(CASE READERType WHEN 1 THEN MESSDATETIME ELSE '99991231' END) AS VARCHAR)WorkingTime
FROM dbo.Times_events
WHERE READERType IN(1,2) AND MESSDATETIME>'20090701'
GROUP BY CARDNUMBER, name1
HAVING DATEDIFF(DAY, MIN(CASE READERType WHEN 1 THEN MESSDATETIME ELSE '99991231' END), MAX(CASE READERType WHEN 2 THEN MESSDATETIME END))=0;
14 июл 09, 13:13    [7413016]     Ответить | Цитировать Сообщить модератору
 Re: Пустыйе значения строк при full join.  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 887
Он выполнился, но без данных.
14 июл 09, 13:33    [7413196]     Ответить | Цитировать Сообщить модератору
 Re: Пустыйе значения строк при full join.  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Slava_Nik
Он выполнился, но без данных.
А если HAVING убрать?
14 июл 09, 14:02    [7413429]     Ответить | Цитировать Сообщить модератору
 Re: Пустыйе значения строк при full join.  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 887
select isnull(a.CARDNUMBER,b.CARDNUMBER) ,isnull(a.name1,b.name1),
--isnull(a.name2,b.name2),isnell(a.name3,bname3), 
date_enter, date_Exit,isnull(convert(varchar,(date_exit-date_enter),108), -- (1)
isnull(date_enter,convert(varchar,date_exit,108))   ---(2)
) as WorkingTime
from 
Почему в первом месте получаем только время, а в втором случае не получаем?
Точнее получаем:
13156488 Абрютин NULL 2009-07-20 19:01:22.000 Jan 1 1900 7:01PM
13156488 Абрютин 2009-07-01 09:25:10.000 NULL Jul 1 2009 9:25AM


Это идет обработка случаев, когда нет входа или выхода, то считаем время либо с 0 часов, либо к 0 часов след.дня.

To:iap
Без HAVING не пробовал -не углублялся.
14 июл 09, 17:25    [7415159]     Ответить | Цитировать Сообщить модератору
 Re: Пустыйе значения строк при full join.  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 887
не пойму, почему так :
select isnull(a.CARDNUMBER,b.CARDNUMBER) ,isnull(a.name1,b.name1),
--isnull(a.name2,b.name2),isnell(a.name3,bname3), 
date_enter, date_Exit,isnull(convert(varchar,(date_exit-date_enter),108),
convert(varchar,date_exit,108)
--isnull(date_enter,convert(varchar,date_exit,108))
) as WorkingTime
Рез-т:
13156488Абрютин NULL 2009-07-20 19:01:22.000 19:01:22
13156488Абрютин 2009-07-01 09:25:10.000 NULL NULL

, а так:
select isnull(a.CARDNUMBER,b.CARDNUMBER) ,isnull(a.name1,b.name1),
--isnull(a.name2,b.name2),isnell(a.name3,bname3), 
date_enter, date_Exit,isnull(convert(varchar,(date_exit-date_enter),108),
--convert(varchar,date_exit,108)
isnull(date_enter,convert(varchar,date_exit,108))
) as WorkingTime
рез-т:
13156488Абрютин NULL 2009-07-20 19:01:22.000 Jan 1 1900 7:01PM- вот это тип
13156488Абрютин 2009-07-01 09:25:10.000 NULL Jul 1 2009 9:25AM

хотелось бы как в первом примере -только часами рез-т, а не PM, да ещё текстовое наименование
16 июл 09, 10:40    [7422249]     Ответить | Цитировать Сообщить модератору
 Re: Пустыйе значения строк при full join.  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
А зачем Вы вообще дату/время в varchar конвертируете?

Пусть себе будет дата/время...
16 июл 09, 10:51    [7422336]     Ответить | Цитировать Сообщить модератору
 Re: Пустыйе значения строк при full join.  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 887
Паганель,

Мне не нужно дата\время, а только часы
19:01:22
16 июл 09, 11:00    [7422411]     Ответить | Цитировать Сообщить модератору
 Re: Пустыйе значения строк при full join.  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Slava_Nik
Мне не нужно дата\время, а только часы
19:01:22
Где?
На клиенте, правда ведь?
Ну так и отрезайте дату на клиенте, сервер отображением данных не занимается
16 июл 09, 11:02    [7422424]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить