2015-02-13 2 views
0

У меня возникла проблема с хранимой процедурой в SQL Server, есть таблица с двумя столбцами datetime, временем начала и временем окончания, на котором я фильтруюсь, в зависимости от местоположения и объекта.SQL хранимая процедура datetime filter по местоположению

В отчете о местоположении, когда установлены условия фильтрации для времени начала и окончания времени, регистрируются только записи местоположения, где время начала не меньше, чем время начала фильтрации и время окончания не позднее фильтрации учитываются при составлении отчета. Например, если на самом деле Джон Доу находился в комнате А с 8:30 до 9:30, а затем в комнате B с 9:30 до 10:30, отчет о местах с 9:00 до 10:00 не будет включать запись Местонахождение Джона Доу.

Желаемое поведение заключается в том, что интервалы местоположения (в отличие от отдельных записей местоположения), которые начинаются до окончания времени и окончания времени окончания, должны быть включены. Что касается презентации, то в случае с Джоном Доу в отчете о выпуске должен быть показан Джон Доу в комнате А с 9:00 до 9:30, а в комнате B - с 9:30 до 10:00, накладывая ограничения на фильтрацию, когда пределы интервала местоположения не находятся в пределах ограничений фильтрации.

Возможно ли это? Если есть какая-либо другая информация, пожалуйста, дайте мне знать, на данный момент я использую базовый И locationchangehistory.starttime> = Starttime AND locationchangehistory.endtime < = @Endtime)

Это полностью сохраненная процедура, в которой компания с помощью, я надеюсь, что форматирование идет правильно: -

     @Asset Varchar (MAX) = NULL OUTPUT, 
        @Location Varchar (MAX) = NULL OUTPUT, 
        @Ward Varchar (MAX) = NULL OUTPUT, 
        @Zone Varchar (MAX) = NULL OUTPUT, 
        @Floor Varchar (MAX) = NULL OUTPUT, 
        @Starttime datetime OUTPUT, 
        @Endtime datetime OUTPUT, 
        @Top int, 
        @FacilityID int 

        AS 
        SELECT DISTINCT TOP (@Top) 


        location.name AS 'Location', 
        monitoredentity.name AS 'Asset', 
        zone.name AS 'Zone', 
        floor.name AS 'Floor', 
        ward.name AS 'Area', 
        locationchangehistory.starttime AS 'Starttime', 
        locationchangehistory.endtime AS 'Endtime', 
        CONVERT(varchar(max), DATEDIFF(SECOND, 
        locationchangehistory.starttime, locationchangehistory.endtime)/3600) + ':' + RIGHT('0' + CONVERT(varchar(2), DATEDIFF(SECOND, locationchangehistory.starttime, 
        locationchangehistory.endtime) % 3600/60), 2) + ':' + RIGHT('0' + CONVERT(varchar(2), DATEDIFF(SECOND, locationchangehistory.starttime, 
        locationchangehistory.endtime) % 60), 2) AS 'TimeInPlace' 


        FROM floor INNER JOIN 
        zone ON zone.floor = floor.id INNER JOIN 
        ward ON zone.id = ward.zone INNER JOIN 
        location ON ward.id = location.ward INNER JOIN 
        locationchangehistory ON location.id =      locationchangehistory.location INNER JOIN 
        monitoredentity ON monitoredentity.id = locationchangehistory.entity 




        WHERE 


        (monitoredentity.type = 4 
       AND floor.facilityid = @FacilityID 
       AND zone.facilityid = @FacilityID 
       AND ward.facilityid = @FacilityID 
       AND Location.facilityid = @FacilityID 
       AND locationchangehistory.facility = @FacilityID 
       AND monitoredentity.facilityid = @FacilityID 
       AND charindex(',' + cast(monitoredentity.id AS VARCHAR(MAX))     + ',', ',' + @Asset + ',') > 0 
       AND locationchangehistory.starttime >= @Starttime 
       AND locationchangehistory.endtime <= @Endtime) 
       AND ((charindex(',' + cast(Location.id AS VARCHAR(MAX)) + ',', ',' + @location + ',') > 0 OR charindex(',' + cast(Ward.id AS VARCHAR(MAX)) + ',', ',' + @Ward + ',') > 0 
       OR charindex(',' + cast(zone.id AS VARCHAR(MAX)) + ',', ',' + @Zone + ',') > 0) OR charindex(',' + cast(floor.id AS VARCHAR(MAX)) + ',', ',' + @Floor + ',') > 0) 




       ORDER by locationchangehistory.starttime DESC` 

ответ

0

Только что изменил ваш выбор и где, попробуйте это.

SELECT DISTINCT TOP (@Top) 
        location.name AS 'Location', 
        monitoredentity.name AS 'Asset', 
        zone.name AS 'Zone', 
        floor.name AS 'Floor', 
        ward.name AS 'Area', 
        locationchangehistory.starttime AS 'Starttime', 
        case when locationchangehistory.endtime<@Endtime then 
         locationchangehistory.endtime else 
          @Endtime 
         end 'Endtime', 
        CONVERT(varchar(max), DATEDIFF(SECOND, 
        locationchangehistory.starttime, locationchangehistory.endtime)/3600) + ':' + RIGHT('0' + CONVERT(varchar(2), DATEDIFF(SECOND, locationchangehistory.starttime, 
        locationchangehistory.endtime) % 3600/60), 2) + ':' + RIGHT('0' + CONVERT(varchar(2), DATEDIFF(SECOND, locationchangehistory.starttime, 
        locationchangehistory.endtime) % 60), 2) AS 'TimeInPlace' 


        FROM floor INNER JOIN 
        zone ON zone.floor = floor.id INNER JOIN 
        ward ON zone.id = ward.zone INNER JOIN 
        location ON ward.id = location.ward INNER JOIN 
        locationchangehistory ON location.id =      locationchangehistory.location INNER JOIN 
        monitoredentity ON monitoredentity.id = locationchangehistory.entity 

       WHERE 

       locationchangehistory.starttime between locationchangehistory.starttime and locationchangehistory.endtime 
       AND locationchangehistory.endtime >= locationchangehistory.starttime 

       AND (monitoredentity.type = 4 
       AND floor.facilityid = @FacilityID 
       AND zone.facilityid = @FacilityID 
       AND ward.facilityid = @FacilityID 
       AND Location.facilityid = @FacilityID 
       AND locationchangehistory.facility = @FacilityID 
       AND monitoredentity.facilityid = @FacilityID 
       AND charindex(',' + cast(monitoredentity.id AS VARCHAR(MAX))     + ',', ',' + @Asset + ',') > 0 
       --AND locationchangehistory.starttime >= @Starttime 
       --AND locationchangehistory.endtime <= @Endtime) 
       AND ((charindex(',' + cast(Location.id AS VARCHAR(MAX)) + ',', ',' + @location + ',') > 0 OR charindex(',' + cast(Ward.id AS VARCHAR(MAX)) + ',', ',' + @Ward + ',') > 0 
       OR charindex(',' + cast(zone.id AS VARCHAR(MAX)) + ',', ',' + @Zone + ',') > 0) OR charindex(',' + cast(floor.id AS VARCHAR(MAX)) + ',', ',' + @Floor + ',') > 0) 
+0

вам лучше отредактировать существующий ответ и добавить его к нему, вместо того, чтобы иметь 2 ответа на один и тот же вопрос. – Tanner

+0

Конечно, в следующий раз! – elmo

+0

Большое спасибо, это было именно то, что я был после, спасибо всем за помощь !! – Zuzana

0

Если я получил вам прямо, вы просто нужно OR-Opreator. С помощью оператора AND вы хотите, чтобы условие для проверки BOTH логических выражений было истинным.

E.g.

A = 1 И B = 1 означает, что если A равно 1, и если и только если A истинно, полезно проверить, равно ли B равно 1. Если первое условие не соответствует действительности, оно не достигнет второго условия, даже если оно верно.

Операция OR проверит, если какое-либо из обоих условий истинно, и возвратите ROW, если был удар по одному из условий.

Мне нравится следующая eplanation как-то:

- compare AND to a multiplication (*) 
- Compare OR to a add operation (+) 
- 1 and 0 are our boolean values 
- so 0 * 1 = 0 and vice versa but 1*1 = 1 
- 1 + 0 = 1, 0+1 and 1+1 = 1 
+0

Я забыл 0 * 0 = 0 и 0 + 0 = 0 – Clevemayer

0

Для выборки данных, я создал таблицу ниже и вставьте записи в нем.

create table #time_managment 
(Empid char(21),Location char(65), timeIN time,OUTtime time) 

Вставка идет сюда.

insert into #time_managment 
values('John Doe','Development Room','8:00','8:30') 
insert into #time_managment 
values('John Doe','INtegration Room','8:40','9:30') 
insert into #time_managment 
values('John Doe','QA Room','10:00','11:30') 

Ниже выбирает покажет все данные в таблице и один с временным диапазоном от 7:00 к 11:00. Используя case, мы можем отображать время ожидания/окончания с требуемым интервалом времени.

select * from #time_managment 
select Empid,Location,timeIN, 
case when OUTTime<'11:00' then 
    OUTTime 
else 
    '11:00' 
end  from #time_managment 
where timeIN between '7:00' and '11:00' 
and OUTtime >=timeIN 
+1

Я надеюсь, что он выглядит лучше вас сейчас Таннера. – elmo

Смежные вопросы