Как рассчитать опыт работы с особым случаем - PullRequest
0 голосов
/ 26 марта 2019

пытаюсь подсчитать годы опыта

Допустим, у кого-то несколько рабочих мест, как указано ниже:

startdate       enddate
2007-08-27      2008-05-09 
2007-08-27      2008-05-09  
2012-01-01      2018-07-31 
2013-01-06      2019-03-25

Какой будет правильный синтаксис sql для выбора начальной даты, конечной даты, которая будет позже включена в функцию для подсчета количества дней для каждого занятия?

Вот мой ожидаемый результат:

1st row: startdate 8/27/2007, enddate 5/9/2008 
2nd row: startdate 1/1/2012, enddate 3/25/2019 

Второе занятие состоялось в то же время для 1-го занятия, поэтому оно не будет учитываться. Четвертое занятие началось до окончания третьего, поэтому мы должны использовать начальную дату для третьего занятия и конечную дату для четвертого занятия

Ответы [ 4 ]

0 голосов
/ 03 июля 2019

Это проблема пробелов и островков в последовательностях, следующий запрос должен делать то, что вы хотите:

CREATE TABLE #emp (empid int, startdate date,enddate date)
INSERT INTO #emp VALUES
(1,'2007-08-27','2008-05-09'),
(1,'2007-08-27','2008-05-09'),
(1,'2012-01-01','2018-07-31'),
(1,'2013-01-06','2019-03-25')

;WITH starts AS (
    SELECT em.*,
            (CASE WHEN EXISTS (SELECT 1
                            FROM #emp em2
                            WHERE em2.EmpID = em.EmpID AND
                                    em2.StartDate < em.StartDate AND
                                    em2.EndDate >= em.StartDate
                            ) THEN 0 ELSE 1 END) AS [IsStart]
    FROM #emp em )

SELECT EmpID
    ,MIN(StartDate) AS [StartDate]
    ,MAX(EndDate) AS [EndDate]
FROM (SELECT s.*, SUM(isstart) OVER (PARTITION BY EmpID ORDER BY StartDate) AS [grp]
      FROM starts s
     ) s
GROUP BY EmpID, grp
ORDER BY EmpID
0 голосов
/ 26 марта 2019

Этот запрос возвращает даты без наложения:

select 
  v.startdate startdate,
  min(vv.enddate) enddate
from view_appemployment v 
inner join view_appemployment vv 
on v.startdate <= vv.enddate
and not exists (
  select * from view_appemployment vvv 
  where vv.enddate >= vvv.startdate and vv.enddate < vvv.enddate
) 
where not exists (
  select * from view_appemployment vvvv 
  where v.startdate > vvvv.startdate and v.startdate <= vvvv.enddate
) 
group by v.startdate

См. Демоверсию
Результаты:

startdate           | enddate            
 ------------------ | ------------------
27/08/2007 00:00:00 | 09/05/2008 00:00:00
01/01/2012 00:00:00 | 25/03/2019 00:00:00
0 голосов
/ 03 июля 2019

Пожалуйста, попробуйте это:

RESULT PIC

SELECT concat(id," row: start date ",date_format(start_date,'%d/%m/%y'),"   end date ",date_format(end_date,'%d/%m/%y'))as dateinfo FROM `dates`
0 голосов
/ 26 марта 2019

Используйте Distinct для удаления дублированных записей. Тогда вы можете использовать этот запрос:

Select totaldays / 365 from 
(Select Sum(
    DATEDIFF(day, srartdate, enddate )
    ) As totaldays
 ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...