1

看过其他可能已经有我答案的问题后,我想为这个问题准备一些帮助。我有一个用于一堆业务的模板网站,其中大多数具有相同的开始和结束时间 - 周一。- 周五,周末休息。但是,有些可能会在周五早些时候关闭,并在周六开放。我相信所有周日都关闭。

我这样创建了一个表 -

CREATE TABLE `Shop_Hours` (
  `shop` mediumint(8) unsigned NOT NULL default '0',
  `d1s` time NOT NULL default '08:00:00',
  `d1e` time NOT NULL default '17:00:00',
  `d2s` time NOT NULL default '08:00:00',
  `d2e` time NOT NULL default '17:00:00',
.
.
.
  `d6s` time NOT NULL default '00:00:00',
  `d6e` time NOT NULL default '00:00:00',
  `d7s` time NOT NULL default '00:00:00',
  `d7e` time NOT NULL default '00:00:00'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

以下是一些记录:

INSERT INTO `Shop_Hours` (`shop`, `d1s`, `d1e`, `d2s`, `d2e`, `d3s`, `d3e`, `d4s`, `d4e`, `d5s`, `d5e`, `d6s`, `d6e`, `d7s`, `d7e`, `Comments`) VALUES(104, '08:00:00', '17:00:00', '08:00:00', '17:00:00', '08:00:00', '17:00:00', '08:00:00', '17:00:00', '08:00:00', '16:00:00', '08:00:00', '12:00:00', '00:00:00', '00:00:00', '');
INSERT INTO `Shop_Hours` (`shop`, `d1s`, `d1e`, `d2s`, `d2e`, `d3s`, `d3e`, `d4s`, `d4e`, `d5s`, `d5e`, `d6s`, `d6e`, `d7s`, `d7e`, `Comments`) VALUES(105, '08:00:00', '17:30:00', '08:00:00', '17:30:00', '08:00:00', '17:30:00', '08:00:00', '17:30:00', '08:00:00', '17:00:00', '00:00:00', '00:00:00', '00:00:00', '00:00:00', '');
INSERT INTO `Shop_Hours` (`shop`, `d1s`, `d1e`, `d2s`, `d2e`, `d3s`, `d3e`, `d4s`, `d4e`, `d5s`, `d5e`, `d6s`, `d6e`, `d7s`, `d7e`, `Comments`) VALUES(106, '08:30:00', '17:30:00', '08:30:00', '17:30:00', '08:30:00', '17:30:00', '08:30:00', '17:30:00', '08:30:00', '17:30:00', '08:30:00', '14:00:00', '00:00:00', '00:00:00', '');

我的问题涉及如何使用经典 ASP 查询记录并显示为以下示例:

星期一。- 周五。上午 8:00 - 下午 5:00

周末休息

或者

星期一。- 钍。上午 8:00 - 下午 5:00

星期五。- 上午 8:00 - 下午 4:00

星期六。- 上午 8:00 - 下午 12:00`

或者

ETC...

我认为有多种方法可以做到这一点我只是想知道是否

  • 我的数据库结构好吗?
  • 获得目标最终结果的最有效方法是什么?

当然会感谢一些帮助。

4

1 回答 1

0

对您的架构的一些评论:

  1. 使用更好的变量名。'd1s',是星期天还是星期一?'starttime_monday',也许?
  2. “00:00:00”的默认值表示“午夜”。也许默认的 NULL 会更好。
  3. 在下面,我的回答所做的第一件事是将您的列翻转为行。您可能会考虑以这种方式存储它们。
  4. 如果大多数公司的工作时间相同,那么为每个人存储价值是低效的。仅存储异常。

也就是说,这是一个适用于您当前模式的(简化的)查询。

请注意,我使用的是 MySQL 的值DAYOFWEEK,如果您在上面解决我的评论,查询将会改变。

select shop,
  case when hours = "12:00AM - 12:00AM" then "Closed" else hours end as hours,
  min(weekday) as minday,
  max(weekday) as maxday
from (
  select shop, "2" as weekday,
    concat(time_format(d1s,"%h:%i%p"),' - ',time_format(d1e,"%h:%i%p")) as hours
  from Shop_Hours
  union
  select shop, "3",
    concat(time_format(d2s,"%h:%i%p"),' - ',time_format(d2e,"%h:%i%p"))
  from Shop_Hours
  union
  select shop, "7",
    concat(time_format(d6s,"%h:%i%p"),' - ',time_format(d6e,"%h:%i%p"))
  from Shop_Hours
) foo
group by 1,2;

输出如下所示:

+------+-------------------+--------+--------+
| shop | hours             | minday | maxday |
+------+-------------------+--------+--------+
|  104 | 08:00AM - 05:00PM | 2      | 3      |
|  104 | Closed            | 7      | 7      |
+------+-------------------+--------+--------+

这将日期的格式留给您...

于 2012-10-04T21:34:52.077 回答