У меня возникла проблема с хранимой процедурой в 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`
вам лучше отредактировать существующий ответ и добавить его к нему, вместо того, чтобы иметь 2 ответа на один и тот же вопрос. – Tanner
Конечно, в следующий раз! – elmo
Большое спасибо, это было именно то, что я был после, спасибо всем за помощь !! – Zuzana