在日期范围表中找到与给定日期范围相交的天数

时间:2019-09-23 05:05:16

标签: sql sql-server

我想查找与日期范围表重叠的日期范围内的总天数。

例如,下表中的2个日期之间有7天。我想找到两者之间的天数也落在此日期范围内:2019-08-01至2019-08-30。

它应该返回1天。

这是数据源查询:

SELECT LeaveId, UserId, StartDate, EndDate, Days
FROM TblLeaveRequest
WHERE UserId = 218
LeaveID     UserID      StartDate               EndDate                 Days
----------- ----------- ----------------------- ----------------------- -----------
22484       218         2019-07-26 00:00:00.000 2019-08-01 00:00:00.000 7

5 个答案:

答案 0 :(得分:4)

我相信这可以为您提供帮助:

MoveInput = (
        transform.right * Input.GetAxisRaw("Horizontal") 
        + transform.forward * Input.GetAxisRaw("Vertical")
        ).normalized;

moveVelocity = MoveInput * MoveSpeed;

Vector3 PlayerDirection = Vector3.right * -Input.GetAxisRaw("RHorizontal") 
        + Vector3.forward * -Input.GetAxisRaw("RVertical");

if (PlayerDirection.sqrMagnitude > 0.0f)
{
    transform.rotation = Quaternion.LookRotation(PlayerDirection, Vector3.up);
}

这假定开始日期不大于结束日期。还假定范围参数始终与表中范围的某些部分相交。

如果参数范围可能不相交,那么您必须通过排除负数来消除这些情况:

normalized

答案 1 :(得分:0)

如果我对问题的理解正确,则您有两个日期范围,并且正在寻找十字路口的天数。

考虑甘特图:

Start_1 .................... End_1
                 Start_2 .......................End_2

如果您可以创建类似

的表结构
LeaveID     UserID      StartDate_1  EndDate_1  StartDate_2  EndDate_2 
----------- ----------- ----------   ---------  ----------   ---------
22484       218         2019-07-26  2019-08-01  2019-08-01   2019-08-30 

您可以确定天数

select 
 leaveID
 , UserID
 ,case 
      when StartDate_2 <= EndDate_1 then datediff(day,StartDate_2,EndDate_1) + 1
      else 0
      end as delta_days_intersection
from table

我希望对您有帮助

答案 2 :(得分:0)

您可以使用数字(Tally)表来计算天数:

SQL Fiddle

MS SQL Server 2017架构设置

CREATE TABLE LeaveRequest
(
  LeaveId Int,
  UserId Int,
  StartDate Date,
  EndDate Date,
  Days Int
)

Insert Into LeaveRequest
VALUES
(22484, 218, '2019-07-26','2019-08-01', 7)

查询1

DECLARE @StartDate Date = '2019-08-01'
DECLARE @EndDate Date = '2019-08-30'
;WITH Tally
AS
(
  SELECT ROW_NUMBER() OVER (ORdER By Numbers.Num) AS Num
  FROM
  (
    Values(1),(2),(3),(4),(5),(6),(7),(8),(9)
  )Numbers(Num)
  Cross APPLY
  (
    Values(1),(2),(3),(4),(5),(6),(7),(8),(9)
  )Numbers2(Num2)
)
SELECT COUNT(DATEADD(d, Num -1, StartDate)) As NumberOfDays
FROM LeaveRequest
CROSS APPLY Tally
WHERE  DATEADD(d, Num -1, StartDate) <= EndDate AND
DATEADD(d, Num -1, StartDate) >= @StartDate AND
DATEADD(d, Num -1, StartDate) <= @EndDate

Results

| NumberOfDays |
|--------------|
|            1 |

答案 3 :(得分:0)

CREATE TABLE #LeaveRequest
(
  LeaveId Int,
  UserId Int,
  StartDate Date,
  EndDate Date,
  Days Int
)

Insert Into #LeaveRequest
VALUES
(22484, 218, '2019-07-26','2019-08-01', 7)

Declare @FromDate datetime='2019-08-01' 
declare @ToDate datetime='2019-08-30'



;With CTE as
(
select top (DATEDIFF(day,@FromDate,@ToDate)+1) 
DATEADD(day, ROW_NUMBER()over(order by (select null))-1,@FromDate) DT
from sys.objects
)

select * from #LeaveRequest LR
cross apply(select count(*)IntersectingDays 
from CTE c where dt between lr.StartDate and lr.EndDate)ca

--or
--select lr.*,c.* 
from  CTE c 
--cross apply
(select lr.* from #LeaveRequest LR 
where c.DT between lr.StartDate and lr.EndDate)lr

drop table #LeaveRequest

更好地创建一个日历表,该表也将始终在其他查询中为您提供帮助。

create table CalendarDate(Dates DateTime primary key)
insert into CalendarDate WITH (TABLOCK)  (Dates)
select top (1000000) 
DATEADD(day, ROW_NUMBER()over(order by (select null))-1,'1970-01-01') DT
from sys.objects

然后在CTE内部编写此代码

select top (DATEDIFF(day,@FromDate,@ToDate)+1) Dates from CalendarDate
where Dates between @FromDate and @ToDate

答案 4 :(得分:0)

DECLARE @FromDate datetime = '2019-08-01' 
DECLARE @ToDate datetime = '2019-08-30'

SELECT
    IIF(@FromDate <= EndDate AND @ToDate >= StartDate,
        DATEDIFF(day,
            IIF(StartDate > @FromDate, StartDate, @FromDate),
            IIF(EndDate < @ToDate, EndDate, @ToDate)
        ),
    0) AS overlapping_days
FROM TblLeaveRequest;