MySQL是介于日期之间的日期范围

MySQL是介于日期之间的日期范围,mysql,sql,Mysql,Sql,我有一张桌子,上面有房间的开始日期和结束日期。我写了以下SQL: SELECT ic.invoice_id, pccr.room_name, DATEDIFF(end, start) AS 'Total Days', pccr.start, pccr.end, FROM partners_campuses_courses_rooms AS pccr JOIN invoices_courses AS ic ON pccr.c

我有一张桌子,上面有房间的开始日期和结束日期。我写了以下SQL:

SELECT ic.invoice_id,
       pccr.room_name,
       DATEDIFF(end, start) AS 'Total Days',
       pccr.start,
       pccr.end,
FROM partners_campuses_courses_rooms AS pccr
         JOIN invoices_courses AS ic ON pccr.course_id = ic.course_id
         JOIN invoices i on ic.invoice_id = i.invoice_id
WHERE pccr.deleted_at IS NULL
    AND pccr.end BETWEEN '2022-12-01' AND '2022-12-31'

这些房间在这些日期之间处于活动状态。但是,当我像这样过滤时

SELECT ic.invoice_id,
       pccr.room_name,
       DATEDIFF(end, start) AS 'Total Days',
       pccr.start,
       pccr.end,
FROM partners_campuses_courses_rooms AS pccr
         JOIN invoices_courses AS ic ON pccr.course_id = ic.course_id
         JOIN invoices i on ic.invoice_id = i.invoice_id
WHERE pccr.deleted_at IS NULL
    AND pccr.end BETWEEN '2022-12-01' AND '2022-12-30'
我没有结果。这些日期就像一个数组:

dates = ['2017-01-01', '2017-01-02', '2017-01-03', ... , '2022-12-30', '2022-12-31']
所以,你可以看到2022-12-30房间是活动的,但我看不到。我该怎么做


希望我能很好地表达自己。

如果您想要在给定日期处于活动状态的行,请使用以下逻辑:

WHERE pccr.deleted_at IS NULL AND
      pccr.end >= $date AND
      pccr.start <= $date
其中pccr.deleted_at为空且
pccr.end>=$date和
pccr.start=$start\u日期和

pccr.start您需要选择开始日期在时段结束之前、开始日期在时段开始之后的房间

SELECT ic.invoice_id,
       pccr.room_name,
       DATEDIFF(end, start) AS 'Total Days',
       pccr.start,
       pccr.end,
FROM partners_campuses_courses_rooms AS pccr
         JOIN invoices_courses AS ic ON pccr.course_id = ic.course_id
         JOIN invoices i on ic.invoice_id = i.invoice_id
WHERE pccr.deleted_at IS NULL
    AND pccr.start < '2022-12-30' AND pccr.end > '2022-12-01'
选择ic.invoice\u id,
pccr房间名称,
DATEDIFF(结束、开始)为“总天数”,
pccr.start,
pccr.end,
来自合作伙伴、校园、课程和pccr房间
在pccr上将发票\课程作为ic加入。课程\ id=ic.course\ id
在ic上连接发票i.invoice\u id=i.invoice\u id
其中,pccr.deleted_at为空
和pccr.start<'2022-12-30'和pccr.end>'2022-12-01'

我想问题在于第二次约会是排他性的。这就像说
结束日期小于'2022-12-30'
。这意味着它将包括一切,直到2022-12-29 23:59:59

所以,你应该多加一天。您的查询应该如下所示:

WHERE pccr.deleted_at IS NULL
    AND pccr.end BETWEEN '2022-12-01' AND '2022-12-31'
通过做

WHERE pccr.deleted_at IS NULL
AND pccr.end BETWEEN '2022-12-01' AND '2022-12-30'
您正在检查是否有任何结束日期介于“2022-12-01”和“2022-12-30”之间。。 所有的结束日期都不是。所以,没有结果是有道理的

您是否试图查看在特定日期范围内哪些房间处于活动状态? 如果是,uou要做的是检查pccr.end是否>=您的开始日期,并检查pccr.start是否小于您的结束日期。这样,你就可以在这两个日期之间或当天得到一切

以你的例子来说:

SELECT ic.invoice_id,
       pccr.room_name,
       DATEDIFF(end, start) AS 'Total Days',
       pccr.start,
       pccr.end,
FROM partners_campuses_courses_rooms AS pccr
         JOIN invoices_courses AS ic ON pccr.course_id = ic.course_id
         JOIN invoices i on ic.invoice_id = i.invoice_id
WHERE pccr.deleted_at IS NULL
    AND pccr.end >= '2022-12-01' 
    AND pccr.start <= '2022-12-30'
选择ic.invoice\u id,
pccr房间名称,
DATEDIFF(结束、开始)为“总天数”,
pccr.start,
pccr.end,
来自合作伙伴、校园、课程和pccr房间
在pccr上将发票\课程作为ic加入。课程\ id=ic.course\ id
在ic上连接发票i.invoice\u id=i.invoice\u id
其中,pccr.deleted_at为空
和pccr.end>=“2022-12-01”

和pccr。顺便说一下,另一个表是不相关的,使用
介于
之间的数据范围过滤被认为是有害的。看看戈登的答案。乍一看,我不明白,但现在我明白了,谢谢。是的,这就是我需要的,谢谢
SELECT ic.invoice_id,
       pccr.room_name,
       DATEDIFF(end, start) AS 'Total Days',
       pccr.start,
       pccr.end,
FROM partners_campuses_courses_rooms AS pccr
         JOIN invoices_courses AS ic ON pccr.course_id = ic.course_id
         JOIN invoices i on ic.invoice_id = i.invoice_id
WHERE pccr.deleted_at IS NULL
    AND pccr.end >= '2022-12-01' 
    AND pccr.start <= '2022-12-30'