如果日期在表

时间:2015-07-15 21:30:05

标签: php mysqli

我试图获取两个日期之间所有内容的列表,包括在特定日期之前和之后具有开始日期和结束日期的项目。

示例:

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之间的日期,则显示结果。

3 个答案:

答案 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)

对于两个日期范围,存在大量重叠案例。完全重叠,完全没有重叠,与各种前/后变化部分重叠。例如数据库中的字段为ab,您正在测试的日期范围为xy

    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)

您正在尝试查找exstartdateextenddate的间隔与您提供的两个日期重叠的所有行。您丢失的行无法匹配,因为一个区间在另一个区间内。你需要这样的东西:

WHERE
exstartdate BETWEEN a AND b
OR
exenddate BETWEEN a AND b
OR
(exstartdate <= a AND exenddate >= b)

ab是您的间隔开始日期和结束日期。你应该记住,即使有一千条记录,这些查询也会很慢。