MySQL是介于日期之间的日期范围
我有一张桌子,上面有房间的开始日期和结束日期。我写了以下SQL: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
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'