问题概述:表中有两个字段,start_time(s),end_time(e),已知e>=s。
查询要求:过滤出s落在某月2号到9号内的数据或者e落在2号到9号内的数据。
分析:按字面的理解,就是取条件:2<=s<=9||2<=e<=9下的数据,由于一条数据是由s和e同时确定的,所以这样取出的数据, 是包含重复数据的,重复数据的条件是2<=s<=e<=9,当然使用distinct或者not exsit,not in等关键字可以过滤掉。
另一个好的思路是使用数学中集合补集的概念(当然第一个思路也使用了集合的思想):数据库中的某条数据要么符合条件,要么不符合条件,两者互斥。如果从正向直接找符合条件的不好找,那么可以 逆向考虑,找不符合条件的数据,然后取其否定。在这个例子中,所有不符合条件的数据包括:s>9的数据(e>=s>9)和e<2的数据(s<=e<2),用数学表达式表示(s>9∪e<2,∪是||的意思),取其否定的数据即为符合的条件的,否定的数据表达式为:s<=9∩e>=2,(∩是&&的意思)转换成sql表达式即为 start_time <=9 AND end_time>=2