【问题标题】:Time Cycle issue in SQL Quires.SQL 查询中的时间周期问题。
【发布时间】:2015-01-14 18:23:33
【问题描述】:

在我的 Rails 应用程序中,目前每个餐厅的应用程序中都有打开和关闭时间表。喜欢

Monday 5:00 AM to 11:45 PM
Tuesday 6:00 AM to 11:00 PM
Wednesday 9:00 AM to 8:00 PM
Thursday 11:00 AM to 11:45 PM
Friday 5:00 AM to 11:45 PM
Saturday 5:00 AM to 11:45 PM

我已将上述时间以 24 小时数据库时间格式保存到数据库中。它工作得很好。由于 24 小时时间,当我尝试获取有关开放餐厅时间的信息时,我能够从数据库中查询数据。但是现在我的客户希望关闭时间可以是凌晨 2:00,凌晨 2:30,因为餐厅肯定会在午夜之后关闭。 如何在 SQL 查询中进行管理?如何查看餐厅在指定时间段内是否营业?

目前我正在执行以下查询:

SELECT 
COUNT(*)
FROM
`sechedules`
WHERE
`sechedules`.`sechedulable_id` = 16
    AND `sechedules`.`sechedulable_type` = 'Operation'
    AND (day = 'Wednesday')
    AND (opening_time <= '21:28:23'
    and closing_time >= '02:28:23'
    and is_closed = 0);

我可以改变一天的周期。它可以从早上 5:00 到凌晨 4:59 开始。但是如何在数据库比较中管理我没有得到最好的解决方案。

【问题讨论】:

  • 像这样跨越时间“区域”是个问题。一个快速/肮脏的技巧是在星期二创建第二个班次,所以这个地方当天开放两次:12:00am -> 2:00am,然后 06:00am -> 11:00pm
  • 说清楚,这是显示问题还是查询问题?
  • @JasonMcCreary 这是一个查询问题,因为我想获取在指定时间营业的餐厅。
  • 也许是这个? Restaurant.where('? BETWEEN opening_time AND closing_time', Time.zone.now)
  • @MrYoshiji 当 opening_time 是 5:00 AM 并且 close_time 是 2:00 AM 时这将不起作用。

标签: mysql ruby-on-rails activerecord


【解决方案1】:

我建议您围绕开始时间和持续时间制定您的查询。您可以从您当前的数据集中执行此操作。此查询从您的表中获取开始时间和持续时间。

select weekday, 
       start, 
       stop,
       timediff(
           if (TIMESTAMPDIFF(MINUTE,start,stop)<0,stop+INTERVAL 24 HOUR, stop), 
           start) duration 
  from sechedules

如您所见,如果它显示为早于开放时间,则将 24 小时添加到关闭时间是一件很奇怪的事情。

然后,您可以像这样检查有多少记录与一天中的特定时间匹配。

select count(*) cnt
 where sechedulable_id = 16
   and day = 'Wednesday'
   and start <= '21:28:23'
   and '21:28:23' <= if(TIMESTAMPDIFF(MINUTE,start,stop)<0,stop+INTERVAL 24 HOUR, stop)

【讨论】:

    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    相关资源
    最近更新 更多