如何高效筛选与指定日期范围<2018-01-01;2018-02-28>冲突的记录?
Absolutely, there's a straightforward and highly efficient method to filter records that conflict with your target date range (2018-01-01 to 2018-02-28). The key is to focus on when two date ranges do NOT overlap, then invert that condition to find conflicts.
Core Logic
Two date ranges do not conflict only if one of these is true:
- The record's interval ends before the target range starts (
record_end < target_start) - The record's interval starts after the target range ends (
record_start > target_end)
To find conflicting records, we just exclude these two cases. In other words, a record conflicts if:
record_start ≤ target_end AND record_end ≥ target_start
This logic is lightning-fast because it uses basic date comparisons—no complex functions—and works seamlessly with database indexes (if you have them on your FROM/TO columns), avoiding full-table scans.
Example Implementations
SQL
If you're querying a database, use this query to pull conflicting records:
SELECT * FROM your_table WHERE FROM_DATE <= '2018-02-28' AND TO_DATE >= '2018-01-01';
Or equivalently, using the "exclude non-conflicts" approach:
SELECT * FROM your_table WHERE NOT (TO_DATE < '2018-01-01' OR FROM_DATE > '2018-02-28');
Python (Pandas)
For processing data in a dataframe:
import pandas as pd # Load and prepare your sample data df = pd.DataFrame({ 'FROM': ['2018-01-01', '2018-01-01', '2017-12-20', '2017-12-25', '2018-03-01'], 'TO': ['2018-01-05', '2018-01-01', '2019-10-19', '2017-12-31', '2018-03-20'], 'COLLIDES': ['YES (with all 5 days)', 'YES (with 1 day)', 'YES (with all 5 days)', 'NO', 'NO'] }) # Convert date columns to datetime format df['FROM'] = pd.to_datetime(df['FROM']) df['TO'] = pd.to_datetime(df['TO']) # Define your target date range target_start = pd.to_datetime('2018-01-01') target_end = pd.to_datetime('2018-02-28') # Filter records that conflict with the target range conflicting_records = df[(df['FROM'] <= target_end) & (df['TO'] >= target_start)] print(conflicting_records)
Validation Against Your Sample Data
Running this logic against your dataset will correctly return the first three records (marked YES):
2018-01-01to2018-01-05→ overlaps fully with the target range2018-01-01to2018-01-01→ overlaps on one day2017-12-20to2019-10-19→ completely encloses the target range
The last two records (marked NO) are excluded as expected—they fall entirely outside the target range.
内容的提问来源于stack exchange,提问作者Bartłomiej Sobieszek

