是否有一種簡單的方法可以在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. SQL重疊日期範圍
- 2. 重疊日期的範圍
- 3. SQL Server找到重疊日期範圍
- 4. 要看看日期範圍重疊SQL日期的另一個範圍
- 5. 檢查兩個日期範圍在Rails的重疊
- 6. 與其他日期範圍重疊的日期範圍
- 7. 查詢2字段日期範圍重疊日期範圍
- 8. 在SQL Server中合併重疊的日期範圍
- 9. 計算丟失的日期範圍和重疊的日期範圍兩個日期
- 10. 兩個日期範圍重疊 - 1501個人缺少錯誤? [PHP]
- 11. Django的 - 防止日期範圍重疊
- 12. SQL日期範圍拆分
- 13. 選擇與某個日期重疊的日期範圍
- 14. MySQL檢查兩個日期範圍是否與輸入重疊
- 15. 如何消除SQL中的重疊日期範圍?
- 16. 乘以與日期兩個表之間的重疊的因子範圍
- 17. MySQL的 - 在單個表中選擇日期範圍重疊
- 18. 如何查詢重疊日期範圍?
- 19. Javascript日期範圍與月重疊
- 20. Mongoid和Rails重疊日期範圍
- 21. 分組在T-SQL的日期範圍
- 22. 從重疊的日期範圍獲取連續的日期範圍
- 23. 摺疊日期範圍
- 24. SQL中的日期範圍
- 25. 在VB.NET重疊日期範圍內計算日期
- 26. 排除日期/時間範圍與重疊的日期/時間範圍
- 27. 如何檢查兩個日期範圍是否在mysql中重疊?
- 28. SQL:計算重疊日期範圍內的天數
- 29. SQL 2日期範圍重疊的天數
- 30. PHP:選擇重疊的日期時間範圍與時間範圍重疊的日期
謝謝你的好解決方案,如果你想要幾天你可以改變int/60並把int/60/60/24 – sandino 2012-10-29 03:01:05