我想查找与日期范围表重叠的日期范围内的总天数。
例如,下表中的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
答案 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)表来计算天数:
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;