是否有一种简单的方法可以在SQL中的两个日期范围内以分钟为单位获得重叠?我正在使用PostgreSQL。在SQL中以分钟重叠的两个日期范围
3
A
回答
5
该函数将处理4个时间戳的任何输入。
CREATE OR REPLACE FUNCTION date_overlap(start1 timestamp, end1 timestamp, start2 timestamp, end2 timestamp) RETURNS int STRICT AS '
-- STRICT returns NULL if any input is NULL
BEGIN
-- for valid ranges, end1 must be after (or equal to) start1, end2 must be after (or equal to) start2
-- for valid overlap, either end1 is after (or equal to) start2 or end2 is after (or equal to) start1
IF end1 < start1 OR end2 < start2 OR start1 < start2 AND end1 < start2 OR start2 < start1 AND end2 < start1 THEN
RETURN NULL;
ELSE
IF start1 > start2 THEN
IF end1 < end2 THEN
RETURN EXTRACT (EPOCH FROM end1 - start1) :: int/60;
ELSE
RETURN EXTRACT (EPOCH FROM end2 - start1) :: int/60;
END IF;
ELSE
IF end2 < end1 THEN
RETURN EXTRACT (EPOCH FROM end2 - start2) :: int/60;
ELSE
RETURN EXTRACT (EPOCH FROM end1 - start2) :: int/60;
END IF;
END IF;
END IF;
END;
' LANGUAGE 'plpgsql'
用法:
SELECT date_overlap(timestamp1, timestamp2, timestamp3, timestamp4) FROM myTable
返回:#分钟为INT
0
假设每个日期范围包含两个日期字段;第一个范围:date1,date2,第二个范围:date3,date4,第一个范围在第二个范围开始后结束。
SELECT (date3 - date2) * interval '1 minute' FROM myTable
未测试,但应该工作。
0
**
Declare @Table Table
(
RowId Int Identity(1, 1) Not Null,
Id NChar(3) Not Null,
StartDate DATETIME Not Null,
EndDate DATETIME Not Null
);
Insert Into @Table (Id, StartDate, EndDate)
Select 'id1', '20131210 10:10', '20131220 10:10' Union All
Select 'id1', '20131211', '20131215' Union All
Select 'id1', '20131201', '20131205' Union All
Select 'id1', '20131206', '20131208' Union All
Select 'id1', '20131225 10:10', '20131225 10:11'
Select *
From @Table;
With Overlaps (OverlapRowId, BaseRowId, OStart, OEnd, BStart, BEnd)
As
(
Select Overlap.RowId, Base.RowId, Overlap.StartDate, Overlap.EndDate, Base.StartDate, Base.EndDate
From @Table As Base
Inner Join @Table As Overlap On Overlap.Id = Base.Id
Where (((Overlap.StartDate > Base.StartDate) And (Overlap.StartDate < Base.EndDate))
Or ((Overlap.StartDate = Base.StartDate) And (Overlap.EndDate > Base.EndDate)))
And (Base.RowId != Overlap.RowId)
)
-- Remove records that were found to cause overlap issues.
Delete T
From @Table As T
Inner Join
(
Select O.OverlapRowId
From Overlaps As O
Left Join Overlaps As Fp On Fp.OverlapRowId = O.BaseRowId
Where (Fp.OverlapRowId Is Null)
) As SubQuery On SubQuery.OverlapRowId = T.RowId;
-- Select the valid options.
Select RowId, Id, StartDate, EndDate
From @Table where StartDate<EndDate;
Go
**
相关问题
- 1. 重叠日期的范围
- 2. 要看看日期范围重叠SQL日期的另一个范围
- 3. 计算丢失的日期范围和重叠的日期范围两个日期
- 4. 两个日期范围重叠 - 1501个人缺少错误? [PHP]
- 5. Django的 - 防止日期范围重叠
- 6. SQL日期范围拆分
- 7. 如何消除SQL中的重叠日期范围?
- 8. 乘以与日期两个表之间的重叠的因子范围
- 9. Javascript日期范围与月重叠
- 10. Mongoid和Rails重叠日期范围
- 11. 折叠日期范围
- 12. 在VB.NET重叠日期范围内计算日期
- 13. 排除日期/时间范围与重叠的日期/时间范围
- 14. SQL中的日期范围
- 15. 如何检查两个日期范围是否在mysql中重叠?
- 16. SQL 2日期范围重叠的天数
- 17. MongoDB - 检查日期范围A是否与其他日期范围重叠b
- 18. 使用自定义日期范围存储重叠日期范围
- 19. SQL日期范围
- 20. SQL日期范围
- 21. 重叠日期范围 - 仅识别重叠
- 22. SQL中的重叠日期
- 23. Jira SQL自定义字段重叠日期范围
- 24. 在PL/SQL中的两个日期范围之间填充日期维度
- 25. 分割重叠范围
- 26. SQL - 日期范围落在给定日期范围之间
- 27. sql计算两次之间的两个日期的分钟
- 28. 多个日期范围的连续重叠C#
- 29. 在python中查找日期范围重叠
- 30. Rails的查询筛选通过,如果两个日期范围重叠比较
谢谢你的好解决方案,如果你想要几天你可以改变int/60并把int/60/60/24 – sandino 2012-10-29 03:01:05