【问题标题】:how to return number of intersecting years and months given two records sql给定两条记录sql如何返回相交的年月数
【发布时间】:2014-09-07 11:47:03
【问题描述】:

我有一个名为 Employee 的表。并且有三个列,分别命名为 start_date 和 end_date 和employee_name。

我正在编写存储过程,它接受两个员工(员工姓名)的 start_date 和 end_date,如果他们一起工作则返回 true,还返回他们一起工作的年数和月数。

所以我想要返回 john 和 kashif 一起工作的年数以及 bool 值 true 或 false(如果他们一起工作)的查询。

我该怎么做?

请任何人都可以帮助我,所以请这样做。

谢谢

【问题讨论】:

  • 员工可以在该表上拥有多于 1 行(即多个开始日期和结束日期)还是总是只有一个日期范围?
  • Brian Demilia 员工在特定情况下只能有一行

标签: sql sql-server tsql sql-server-2012


【解决方案1】:
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

结果

Has Worked together      Days worked together
       1                            30

存储过程

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

【讨论】:

    【解决方案2】:

    检查这个查询:

    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
    

    【讨论】:

      猜你喜欢
      • 2016-09-02
      • 2020-12-29
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多