在选择多个日期时设计表格

时间:2018-04-22 22:55:19

标签: database sqlite database-design

我有一张表Hall,其结构类似于

CREATE TABLE Hall_tbl (
    hall_id INTeger PRIMARY KEY AUTOINCREMENT NOT NULL,
    name TEXT,
    price INTEGER,
    capacity INTEGER,
    availibility INTEGER
);

现在,该应用程序的目的是使其以用户查看日历的方式工作 - >选择日期 - >如果Hall在特定日期可用,则用户可以与其进行交互。

所以,归结为Availibility很重要,它应该引用Dates串。用户打开特定日期后,会显示Time Slots。根据{{​​1}}用户可以选择大厅。我很难想到如何实现它。

首先,我想创建一个名为Available Time Slots的表,其列日期从1-1-2018到1-1-2020,并创建多个时间段,如dates 0-1 .. 1-22-24表示他们没有出售,我会在用户选择开放0时更改为1。但这将需要我创建365 * 4行和25列,这是完全没有效率的。那我怎么能这样做呢?

许多与票务预订相关的申请,航班预订已经实施了这样的东西。那么,他们如何有效地做到这一点?

我使用的技术是Hall

1 个答案:

答案 0 :(得分:1)

你可以做的是有一个开放日期的表格,只添加开放日期,然后检查日期是否有一行,如果是,那么大厅是开放的,否则不是。

所以根据你的Hall_tbl你可以: -

你的Hall_tbl

CREATE TABLE IF NOT EXISTS Hall_tbl (
    hall_id INTEGER PRIMARY KEY,
    name TEXT,
    price INTEGER,
    capacity INTEGER,
    availibility INTEGER
);
  • AUTOINCREMENT不是必需的,除非必要,否则建议不要使用SQLite Autoincrement
  • 可用性列不是必需的,但已经保留

添加一些大厅(4 id' 1-4)

INSERT INTO  Hall_tbl (name, price, capacity, availibility)
    VALUES('Grand Hall',200,50,0), 
        ('Large Hall',100,25,0), 
        ('Normal Hall',75,20,0),
        ('Small Hall',50,15,0);

大厅开放时间表

CREATE TABLE IF NOT EXISTS hall_opening_times (hall_reference, open_date);

添加一些开放时间(5)

INSERT INTO hall_opening_times 
    VALUES (1,'2018-04-23'), -- Grand hall open on 2018-04-23 
           (2,'2018-04-23'), -- Large Hall open on 2018-04-23
           (2,'2018-04-25'), -- Large Hall open on 2018-04-25
           (3,'2018-04-24'), -- Normal Hall open on 2018-04-24
           (4,'2018-04-23'); -- Small Hall open on 2018-04-23

检查大厅是否打开

以下内容将返回单行,其中单个列的值为0(未打开)或1(打开): -

今天检查大礼堂(这里是2018-04-23)

SELECT count() > 0 AS hall_open  FROM hall_opening_times WHERE hall_reference = 1 AND date(open_date) = date('now');
  • 它返回1(在 hall_open 列中),因为大礼堂(ID = 1)今天在2018-04-03开放(date('now')

今天检查师范大厅

SELECT count() > 0 AS hall_open  FROM hall_opening_times WHERE hall_reference = 3 AND date(open_date) = date('now');
  • 它返回0(在hall_open列中),因为2018-04-03没有ID 3的条目

多一点

您可以使用以下内容获取开放大厅列表: -

SELECT group_concat(name,' - ') AS open_halls 
FROM hall_opening_times JOIN Hall_tbl ON hall_reference = Hall_tbl.hall_id
WHERE open_date = date('now')

2018-04-23将返回(在open_halls栏中): -

大礼堂 - 大礼堂 - 小礼堂

如果以前的SQL更改为(明天2018-04-24检查): -

SELECT group_concat(name,' - ') AS open_halls 
FROM hall_opening_times JOIN Hall_tbl ON hall_reference = Hall_tbl.hall_id
WHERE open_date = date('now','+1 DAY')

然后它会返回: -

师范大厅

您可以使用以下内容修剪过去的open_times(如果需要) -

DELETE FROM hall_opening_times WHERE open_date < date('now','-1 WEEK');
  • 将从当前日期删除超过1周的行。

关于日期格式的说明

日期格式yyyy-MM-dd是使用SQLite日期函数识别/支持的日期格式,而不是d-M-yyyy可以使事情变得更加简单。