查找日期之间的可用时间段

时间:2013-09-30 07:28:03

标签: mysql sql

我正在为预订日历创建一个REST API,现在我正在尝试找出一种最有效的编写查询的方法,该查询返回两个日期之间的所有时间戳,间隔为15分钟。如果我提供2013-09-212013-09-22,我希望得到:

2013-09-21 00:15:00
2013-09-21 00:30:00
2013-09-21 00:45:00
2013-09-21 01:00:00
2013-09-21 01:15:00
2013-09-21 01:30:00
...
2013-09-22 23:15:00
2013-09-22 23:30:00
2013-09-22 23:45:00

然后我会将此查询用作子查询并在其上应用一些条件以删除工作时间以外的时间段(不是常数),预订的时间段等。

我看过很多博客文章,其中作者创建了一个存储所有这些时间戳的“日历表”,但这对我来说似乎是一种浪费,因为不需要存储数据。

有关如何执行此操作的建议或更好的方法来获取/存储数据?

1 个答案:

答案 0 :(得分:0)

这是一个过程,它生成95行,递增日期变量,然后左边将带有日期条目的表连接到生成日期行的“solid”表。

select str_to_date('2010-01-01', '%Y-%m-%d') into @ad;

select * from

(select (@ad := date_add(@ad, INTERVAL 15 MINUTE)) as solid_date from wp_posts limit 95) solid
left join
wp_posts
  on solid.solid_date = post_date

我不知道如何在mysql中生成任意数量的行,所以我只是从一个超过95行的表中选择(24小时*每小时4次约会,而不是午夜时间) - 我的wordpress帖子表。如果没有更好的方法可以做到这一点,那么没有什么能阻止你制作这样一个表并且只有一个带有单个递增整数的列(我是一个oracle guru而不是mysql)。也许没有一个:How do I make a row generator in MySQL?

如果您看到wp_posts,请替换约会表的名称。如果您看到日期,请替换您的开始日期。

上面的查询会生成一个日期列表,其中包含所选日期午夜后的15日(在我的示例中为2010-01-01)

如果您只想找到空闲广告位,可以添加WHERE appointments.primary_key_column_here IS NULL

请注意,您的规格中未包括午夜。如果您想要在第一天的午夜,请在15分钟前在变量中开始日期,并将自己限制为96行。如果您想在结束日午夜,只需将自己限制为96行