我在表格中有几行,每行包含开始日期和结束日期。用户具有一年中每个月的复选框。我需要确定哪些行包含的日期范围包括用户选择的任何月份。
检查开始和放大很容易例如,MONTH(start_date) IN ($month_list)
结束月份,但这种方法与两个日期之间的任何月份都不匹配。
所以我想我要问的是:有没有办法从纯粹用SQL的日期范围中获得包容性月份?
答案 0 :(得分:0)
这样的事可以帮助吗?
WHERE
MONTH(start_date) < MONTH_YOU_ARE_CHECKING and
MONTH() > MONTH_YOU_ARE_CHECKING
如果您需要立即检查所有月份,您可以列出所有月份,并从列表中删除用户选择的月份,并在与列表进行比较后。使用伪代码示例会更好:)
MONTHS = 1,2,3,4,5,6,7,8,9,10,11,12
USER_SELECTED_MONTHS= 1,6,8,9,12
LIST_TO CHECK = 2,3,4,5,7,10,11
所以,现在你可以这样做:
MONTH(start_date) NOT IN (2,3,4,5,7,10,11)
您怎么看?它对您有帮助吗?
问候
答案 1 :(得分:0)
我假设您希望包含日期范围跨越或与所选期间相交的数据行 - 在这种情况下,我会将用户选择的期间推入表格并进行模糊连接,例如... ..
SELECT DISTINCT at.*
FROM a_table at, user_periods up
WHERE at.start_date<=up.end_date
AND at.end_date>=up.start_date
AND up.trans_id=$SOME_VAR
(trans_id只允许该表用于多个操作)
为了最大限度地减少工作量,user_periods表应该在start_date和end_date上有一个索引,对于a_table应该类似。