首页 > 解决方案 > 如何在sql数据库中存储日+时隙

问题描述

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

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

标签: sqlsql-server

解决方案


没有一种正确的方法,有几种方法,各有利弊。

如果您要使用数据查看商店当前是否营业,我认为最容易使用的是定义第二张表,其中每行一家商店一天的小时数

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

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


推荐阅读