我有一个表 leave_applications ,其中包含从 date 到 date 的两列。我需要从表中获取休假日期在给定月份的那些行,这意味着从日期到日期之间的至少一个日期在给定月份中的行。
因此,我需要一个查询来获取具有两组日期(即 from_date 和 to_date)和该月所有日期的交集的行。
如果 A < D 和 B > C,则两个范围 AB 和 CD 重叠。在伪 SQL 中,
select * from leave_applications where
from_date < (last day of month) AND to_date > (first day of month)
如果 from_date 或 to_date 与该月的第一天和最后一天重合,则使用 <= 和 >= 如果您认为它是重叠的。
我前段时间写过这些查询。这是解决方案:
-- 2.2) select date ranges that overlap [d1, d2] (d2 and end_date are inclusive)
SELECT * FROM <table> WHERE @d2 >= start_date AND end_date >= @d1
所以如果你想检查 2012 年 12 月的叶子,你应该写:
SELECT * FROM leave_applications
WHERE '2012-12-31' >= from_date AND to_date >= '2012-12-01'