我试图获取两个日期之间所有内容的列表,包括在特定日期之前和之后具有开始日期和结束日期的项目。
示例:
SELECT * FROM expenses WHERE (userid = '#' AND exstartdate >= '2015-07-25'
AND exenddate <= '2015-08-24') OR (userid = '#' AND reg='Yes')
ORDER BY eamount DESC LIMIT 0, 25
eid ename eamount userid exstartdate exenddate paid reg
1 Bill 1 1000 # 2015-01-01 2015-11-01 no Yes
17 bill 17 300 # 2015-07-29 2015-07-29 no No
2 Bill 2 85 # 2013-11-01 2017-12-31 no Yes
6 Lunches 80 # 2015-01-01 2016-12-31 no Yes
我也想尝试这个:
3 Bill 3 87.00 1 Yes 2015-01-01 2016-05-01 no No
但除非我颠倒&gt;否则似乎无法做到。和&lt;。由于reg旗帜,账单1,2和午餐出现了。
我想知道这样做是否会更好。
编辑:为了澄清,我希望从表格中获取介于$ date1(在2015-07-25之上看到)和$ date2(2015-05-24)之间的所有项目。该表具有开始日期和结束日期,如果表中的日期包括$ date1和$ date2中列出的日期。
因此,如果$ date1(2015-07-25)在exstartdate(2015-01-01)之后且$ date2(2015-08-24)在exenddate之前(2015-11-01)则显示结果。
还显示exstartdate和exenddate是否在$ date1和$ date2之间。
基本上,如果exstartdate和exenddate之间的日期也匹配$ date1和$ date2之间的日期,则显示结果。
答案 0 :(得分:0)
根据您的描述,您想要:
SELECT * FROM expenses
WHERE userid = '#' AND
((exstartdate >= '2015-07-25' AND exenddate <= '2015-08-24') OR
(exstartdate < '2015-07-25' AND exenddate > '2015-08-24') OR
reg='Yes')
ORDER BY eamount DESC LIMIT 0, 25
答案 1 :(得分:0)
对于两个日期范围,存在大量重叠案例。完全重叠,完全没有重叠,与各种前/后变化部分重叠。例如数据库中的字段为a
和b
,您正在测试的日期范围为x
和y
:
a b
x y - simple, no overlap at all
x y - simple, no overlap at all
x y - x outside, y inside/on
x y - x outside, y inside/on
x y - x outside, y inside/on
x y - complete overlap
x y - y outside, x inside/on
x y - y outside, x inside/on
x y - y outside, x inside/on
xy - x = y = a
xy - x = y = b
xy - complete overlap
它变得丑陋,所以......你需要哪一种情况?
答案 2 :(得分:0)
您正在尝试查找exstartdate
到extenddate
的间隔与您提供的两个日期重叠的所有行。您丢失的行无法匹配,因为一个区间在另一个区间内。你需要这样的东西:
WHERE
exstartdate BETWEEN a AND b
OR
exenddate BETWEEN a AND b
OR
(exstartdate <= a AND exenddate >= b)
a
和b
是您的间隔开始日期和结束日期。你应该记住,即使有一千条记录,这些查询也会很慢。