我正在创建一个查询,以显示当前日期时间前一周和后一天的表现,但是我想也许我错过了一个技巧,因为它要么是以某种方式过滤结果,要么不是同时采取两种方式考虑范围
SELECT BookID, concat(c.FirstName, ' ', c.SurName) as CustName, m.Title, pic.City, s.Name, DATE_FORMAT(p.TimeStarts, '%a - %b %e - %Y') AS Date, DATE_FORMAT(p.TimeStarts, '%h:%i %p') AS Time, b.NumAdults, b.NumChilds, b.TotalCost
FROM booking b
JOIN customer c ON b.CustID = c.CustID
JOIN perf p ON b.PerfID = p.PerfID
JOIN movie m ON p.MovieID = m.MovieID
JOIN screens s ON p.ScreenID = s.ScreenID
JOIN pictures pic ON s.PictureID = pic.PictureID
WHERE b.BookID = BookingID AND p.TimeStarts > NOW() - INTERVAL 1 DAY AND p.TimeStarts < NOW() + INTERVAL 7 DAY;
非常感谢任何有关此事的帮助
编辑: 下面似乎已经解决了我的问题,我已经添加或扣除了日期,并将其与当前时间进行了比较,看起来有点像一个颠倒的混乱逻辑,但奇怪的工作......特别感谢Arth在接受我这样做以错误的方式约会,将你的答案标记为已解决,因为它确实有很大帮助。非常感谢其他人的贡献
SELECT BookID, concat(c.FirstName, ' ', c.SurName) as CustName, m.Title, pic.City, s.Name, DATE_FORMAT(p.TimeStarts, '%a - %b %e - %Y') AS Date, DATE_FORMAT(p.TimeStarts, '%h:%i %p') AS Time, b.NumAdults, b.NumChilds, b.TotalCost
FROM booking b
JOIN customer c ON b.CustID = c.CustID
JOIN perf p ON b.PerfID = p.PerfID
JOIN movie m ON p.MovieID = m.MovieID
JOIN screens s ON p.ScreenID = s.ScreenID
JOIN pictures pic ON s.PictureID = pic.PictureID
WHERE b.BookID = booking AND
(
p.TimeStarts - INTERVAL 6 DAY <= NOW()
AND
p.TimeStarts + INTERVAL 1 DAY >= NOW()
)
答案 0 :(得分:3)
您的查询涵盖从之前1天到1周之后的范围:
p.TimeStarts > NOW() - INTERVAL 1 DAY AND p.TimeStarts < NOW() + INTERVAL 7 DAY;
从1周前到1天后(根据要求)的范围是:
p.TimeStarts > NOW() - INTERVAL 7 DAY AND p.TimeStarts < NOW() + INTERVAL 1 DAY;
我倾向于将>=
用于第一个运算符,因为它更适合基于日期的查询,我喜欢一致性。除非这个查询非常重要,否则它的影响可以忽略不计。
<强>更新强>
就我个人而言,我从不使用BETWEEN
作为日期或时间范围,因为通常我希望max是独占的。
考虑我想要包括11月16日的所有预订,这是正确的:
p.TimeStarts >= '2015-11-16' AND p.TimeStarts < '2015-11-16' + INTERVAL 1 DAY
这是不正确的,因为它包括11月17日00:00:00
:
p.TimeStarts BETWEEN '2015-11-16' AND '2015-11-16' + INTERVAL 1 DAY
我看到了很多,但它取决于第二个是记录的最短时间单位,让我们面对它是非常可怕的:
p.TimeStarts BETWEEN '2015-11-16 00:00:00' AND '2015-11-16 23:59:59'
答案 1 :(得分:2)
您可以尝试使用OR代替AND
WHERE b.BookID = BookingID
AND (p.TimeStarts > NOW() - INTERVAL 1 DAY OR p.TimeStarts < NOW() + INTERVAL 7 DAY);
答案 2 :(得分:1)
我正在创建一个查询,以显示1周前和1天的表演 在当前日期时间之后
您的查询的日期应为
select * from table between `lowerdate` and `upperdate`
试试这个条件:
AND p.TimeStarts BETWEEN (CURDATE() - INTERVAL 7 DAY) AND (CURDATE() + INTERVAL 1 DAY)