如何在SQL数据库中存储日+时隙

时间:2019-09-11 16:36:45

标签: sql sql-server

假设我有一个商店所有者可以在其中添加商店的应用程序。对于每个商店,我必须在商店营业时存储信息。例如

  • 星期一8:00-20:00
  • 星期二9:30-22:00
  • 星期日11:00-18:00

我有一张有商店的桌子(ID,名称,地址,电子邮件等)。当每个商店都在sql数据库中打开时,存储有关这些日+时段信息的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

没有一种正确的方法,有几种方法各有优缺点。

如果您要使用数据来查看一家商店目前是否开张,我认为最容易使用的方法是定义第二张表,其中每一行一家商店的一天的工作时间为一天

CREATE TABLE StoreHours(
    HourID int IDENTITY(1,1) NOT NULL,
    StoreID  int NOT NULL,
    DayOfHours int NOT NULL, 
    --Could be char(2) if you wanted to store day as Su, M, Tu, ...
    --but storing as an integer is useful with other queries
    Opens time(0) NOT NULL,
    Closes time(0) NOT NULL,
    --And maybe LastUpdated datetime(0) if you cared
 CONSTRAINT [PK_StoreHours] PRIMARY KEY CLUSTERED ( HourID ASC )
)

查询可以使用日期函数(例如DatePart)来确定星期几,然后可以将其与StoreID一起使用来查询一天中的小时数。

例如,要查找开放的加油站,查询可能看起来像这样(如果您还具有地理位置数据,显然更有用...)

SELECT * 
FROM Store as S INNER JOIN StoreHours as H on S.StoreID = H.StoreID
WHERE S.TypeOfStore = 'Gas Station' 
    AND H.DayOfHours = DATEPART(weekday, GETDATE())
    AND CONVERT(TIME(0), GETDATE()) < H.Closes
    AND CONVERT(TIME(0), GETDATE()) > H.Opens

另一方面,如果仅显示它们(例如在网站上)而不进行任何比较,则将它们存储为文本字符串将节省您的工作。您仍然可以做辅助表,每天做一行,或者您可以在每个商店中使用一行,将每天的小时数放在专用列中。这真的很难在查询中使用,但非常容易显示。