简体   繁体   English

给定两条记录sql如何返回相交的年月数

[英]how to return number of intersecting years and months given two records sql

I have table named Employee. 我有一个名为Employee的表。 And there are three columns named start_date and end_date and employee_name. 并且有三列名为start_date和end_date以及employee_name。

I am writing stored procedure which accepts start_date, end_date for two employees(employee names) and return true if they have worked together and also returns number of years and months they have worked together. 我正在编写一个存储过程,该过程接受两名雇员(雇员姓名)的start_date,end_date,如果他们一起工作,则返回true,还返回他们一起工作的年数和月数。

在此处输入图片说明

so I want query that returns number of years john and kashif worked together and bool value true or false if they worked together. 所以我想要查询返回john和kashif一起工作的年数的查询,如果他们一起工作,则布尔值true或false。

How can I do this? 我怎样才能做到这一点?

Please anyone out there can help me so please do. 请在那里的任何人都可以帮助我,请这样做。

Thanks 谢谢

DECLARE @emp1 VARCHAR(10) = 'John'
DECLARE @emp2 VARCHAR(10) = 'Kashif'


SELECT CASE WHEN EXISTS (SELECT 1 FROM Emp
                         WHERE empID = @emp2
                          AND StartDate >= t.StartDate
                          AND EndDate   <= t.EndDate)
             THEN 1 ELSE 0 END  [Has Worked together]
      ,CASE WHEN EXISTS (SELECT 1 FROM Emp
                         WHERE empID = @emp2
                          AND StartDate >= t.StartDate
                          AND EndDate   <= t.EndDate)
             THEN DATEDIFF(DAY, CASE WHEN StartDate <= t.StartDate THEN StartDate ELSE t.StartDate END 
                             ,  CASE WHEN EndDate   >= t.EndDate   THEN EndDate   ELSE t.EndDate   END) 
                      ELSE 0 END  [Days worked together]
FROM Emp t
WHERE empID = @emp1

Result 结果

Has Worked together      Days worked together
       1                            30

Stored Procedure 储存程序

CREATE PROCEDURE dbo.myProc 
@Employee1       VARCHAR(20),
@Employee2       VARCHAR(20),
@Worked_Together BIT OUTPUT,
@Days_Worked     INT OUTPUT
AS
BEGIN
  SET NOCOUNT ON; 

SELECT @Worked_Together 
        = CASE WHEN EXISTS (SELECT 1 FROM Emp
                            WHERE empID = @Employee2
                              AND StartDate >= t.StartDate
                              AND EndDate   <= t.EndDate)
                            THEN 1 ELSE 0 END  
      ,@Days_Worked  
         = CASE WHEN EXISTS (SELECT 1 FROM Emp
                              WHERE empID = @Employee2
                                AND StartDate >= t.StartDate
                                AND EndDate   <= t.EndDate)
             THEN DATEDIFF(DAY, CASE WHEN StartDate <= t.StartDate THEN StartDate ELSE t.StartDate END 
                             ,  CASE WHEN EndDate   >= t.EndDate   THEN EndDate   ELSE t.EndDate   END) 
                      ELSE 0 END  
FROM Emp t
WHERE empID = @Employee1        

END

Check this query : 检查此查询:

DECLARE @Start_Date DATE ='2012/08/01'
DECLARE @End_Date DATE ='2014/08/01'

SELECT T1.ProfileName,
       T1.ProfileName,
       DATEDIFF(YEAR,CASE WHEN T1.START_DATE > T2.START_DATE THEN T1.START_DATE  ELSE T2.START_DATE                     End,CASE WHEN T1.End_DATE > T2.End_DATE THEN T2.End_DATE  ELSE T1.End_DATE End ) Years
FROM Tbl T1,Tbl T2 
WHERE T1.Start_Date  >= @Start_Date 
      AND T2.Start_Date >= @Start_Date
      AND T1.End_Date <= @End_Date 
      AND T2.End_Date <= @End_Date

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM