我在数据库中有开始日期(l_start_date),结束日期(l_end_date)和日期(l_date)。
例如,用户选择开始日期为15-01-2016,结束日期为30-01-2016。如何获取包含用户选择的开始日期和结束日期之间的日期的所有日期行(l_date)?
我被击中:在下图(l_date)中2016-01-29,2016-01-30,2016-02-01,2016-02-02。在这里我怎么能得到这一行,因为用户范围是2016-01-30但结束日期(l_end_date)我已经存储2016-02-02所以它忽略了。
我试过了:
SELECT l_date,l_start_date,l_end_date
FROM `dates`
WHERE (l_end_date >= '2016-01-15' or l_end_date <= '2016-01-15') AND
(l_start_date >= '2016-01-15' or l_end_date <= '2016-01-15') AND
(l_end_date >= '2016-01-30' or l_end_date <= '2016-01-30') AND
(l_start_date >= '2016-01-30' or l_end_date <= '2016-01-30')
答案 0 :(得分:1)
您可以使用以下逻辑:
where l_end_date >= '2016-01-15' and -- the input start date
l_start_date <= '2016-01-30' -- the input stop date
规则很简单。如果在第二个结束之前开始,则两个间隔重叠。第一次开始后,第一次结束。
对于完全重叠,逻辑略有不同:
where l_end_date >= '2016-01-30' and -- the input stop date
l_start_date <= '2016-01-15' -- the input start date
另请注意,不等式可能是严格的不等式(“&lt;”和“&gt;”),具体取决于间隔的定义方式。
答案 1 :(得分:0)
@Gordon Linoff给出的答案解释得非常好,但要转化为您可能理解的背景:
您的标准根本不是标准。
(l_end_date >= '2016-01-15' or l_end_date <= '2016-01-15')
将返回所有记录,因为如果end_date不是&t;&gt; =它是&lt; =结束日期,即该逻辑。下一行也是如此。所以你实际上根本没有where子句。这里的关键词是或。
尝试@Gordon Linoff提供的查询
SELECT l_date,l_start_date,l_end_date
FROM `dates`
where l_end_date >= '2016-01-30' and -- the input stop date
l_start_date <= '2016-01-15' -- the input start date