MySQL找到第一个周末

时间:2011-04-15 13:47:37

标签: php mysql date

我有一张餐桌可以预订餐厅。它只有一个restaurant_id和一个日期列,用于指定实际日期(我们正在谈论全天预订)。

我想知道什么时候是特定餐厅的下一个周末。 “周末”是周六或周日。如果其中一个可用,那么我们有一个可用的周末。

当然,查询应考虑计算下周末的当前时间。

有人可以帮忙吗?

以下是“日期”表格的表格结构和数据,其中包含目前为止所做的所有预订:

id    id_venue    date  
12    1           2011-04-22  
13    1           2011-04-23  
14    1           2011-04-24  
15    1           2011-04-30  
16    1           2011-05-07  
17    1           2011-05-08

如你所见,23-24的周末已满,所以5月7日至8日的周末。我需要找到的是2001-05-01的日期,这是在今天的日期之后的第一个星期六或星期日。

4 个答案:

答案 0 :(得分:2)

我认为其他人都错过了这个问题......他们认为你的桌子可能已经在所有周末都有人口,有些状态是打开还是没有...我的猜测是你的桌子只有一个记录如果保留...因此,你需要找到根本不存在的记录...基于一些自动查找日期......

这是对我已完成的另一篇文章的修改here

虽然我没有更改查询的上下文,但我只放入与您的表关联的列。我知道你只是反对一个场地桌,所以我(实际上)。但是,为了理解“JustDates”别名,这个INNER PRE-QUERY通过对任何其他表进行笛卡尔连接来创建一个动态填充的所有日期表。在这种情况下,您的“Venue”预订表(我没有' t明确地看到你的实际表名引用,所以你必须改变它。因此,这实际上创建了一个表格,其中包含从“今天”开始的所有日期,并持续30天(通过限制),但可以是40,50,300或您需要的数量......提供“YourVenueTable”至少与您想要测试的天数一样多。 (在帖子中的相同澄清源于此)。这个结果集在30天,40天或多天内被预过滤仅在1周日或7周六的给定日期...所以它应该返回仅4月23日,4月24日,4月的结果集5月30日,5月1日,5月7日,5月8日,5月14日,5月15日,5月21日,5月28日等。

现在,您正在考虑前进的所有可能日期的动态创建结果集。现在,它将加入您的实际Venue Reservations表并被过滤为仅返回那些未找到您关注的id_venue的日期。在您的数据示例中,它将在4月23日和24日找到匹配并且不返回这些记录。与4月30日相同...但是,它会发现包含5月1日的资格预审清单中的记录将无法在场地表中找到日期匹配,因此包括您正在预期的...它将继续跳过5月7日和8日,然后返回5月14日,15日,21日,28日等......

select JustDates.OpenDate
  from 
      ( select
         @r:= date_add( @r, interval 1 day ) OpenDate
      from
         ( select @r := current_date() ) vars,
         Venue 
      LIMIT 30 ) JustDates
   where
      DAYOFWEEK( JustDates.OpenDate ) IN ( 1, 7 )
      AND JustDates.OpenDate NOT IN
          ( select Venue.date
                from Venue
                where Venue.id_venue = IDYouAreInterestedIn
                  and Venue.Date = JustDates.OpenDate )
    order by 
       JustDates.OpenDate

注意,根据其他预订发布,对于预定日期可用日期的查询,上限为30以上,可以是系统中的任何表格,只要它至少有你想要期待的那么多天。预订...如果您想要即将到来的一年的所有可用性,您将需要用于笛卡尔结果的表中的365条记录来通过动态创建的“日期”记录来获取@r循环。

答案 1 :(得分:0)

SELECT ...... DAYOFWEEK(`date`) as `num` FROM .... WHERE  num = 1 OR num = 7

我不知道你想怎么检查“可用性”

答案 2 :(得分:0)

怎么样?:

SELECT * FROM table WHERE (DAYOFWEEK(date)=1 OR DAYOFWEEK(date)=7) AND restaurant_id =$RESTAURANTID AND date >  CURDATE() ORDER BY date ASC LIMIT 1

答案 3 :(得分:0)

设置从今天到下一个Saterday的天数(如果是0,那么今天是Saterday) 假设今天是星期天,你只想预订下一个整个周末。

select @OffsetSaterday:= mod((8-DayOfWeek(CurDate())+7,7);

您还没有提供足够的信息来了解预订数据库的外观,所以我猜这里。

每家餐厅都有座位:

Table seats
  id: integer primary key
  rest_id: integer  #link to restaurant
  desc: varchar(20) # description of the seat.

Table restaurant
  id: integer primary key
  other fields.....

Table Reservation
  id: integer primary key
  reservation_date: date
  seat_id: integer

获取下周末所有可用座位的select语句是:

select @OffsetSaterday:= mod((8-DayOfWeek(CurDate())+7,7);
select s.*, rst.* from seats s
  inner join restaurant rst on (rst.id = seats.rest_id)
  left join r on (r.seat_id = s.id 
    and r.reservation_date between 
      date_add(curdate(),interval @OffsetSaterday day) and
      date_add(curdate(),interval @OffsetSaterday+1 day)
where r.id is null
order by s.rest_id, s.desc;

您可以将两个选项合并为一个,但MySQL不保证表达式的评估顺序,所以我建议不要这样做。