日期范围从现在开始查询

时间:2015-11-17 13:46:00

标签: mysql

我正在创建一个查询,以显示当前日期时间前一周和后一天的表现,但是我想也许我错过了一个技巧,因为它要么是以某种方式过滤结果,要么不是同时采取两种方式考虑范围

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()
)

3 个答案:

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