sql - 如何在sql数据库中存储日+时隙
问题描述
假设我有应用程序,商店的所有者可以在其中添加他们的商店。对于每家商店,我必须在商店营业时存储信息。例如
- 周一 8:00 - 20:00
- 周二 9:30 - 22:00
- 周日 11:00 - 18:00
我有一张带商店的桌子(身份证、姓名、地址、电子邮件等)。当每个商店在sql数据库中打开时,存储有关这些日期+时间段的信息的正确方法是什么?
解决方案
没有一种正确的方法,有几种方法,各有利弊。
如果您要使用数据查看商店当前是否营业,我认为最容易使用的是定义第二张表,其中每行一家商店一天的小时数
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
另一方面,如果您只是显示它们(如在网站上)而不进行任何比较,那么将它们存储为文本字符串可以节省您的工作量。您仍然可以使用辅助表和每天一行,或者您可以在每个商店使用一行,并将每天的时间放在专用列中。这真的很难在查询中使用,但很容易显示。
推荐阅读
- angular - 当下方空间不足时,Mat-menu 不会自动更改位置
- python - Pandas DataFrame 中是否有比我正在做的更有效的转置?
- flutter - 如何使用 Dio 将多个图像上传到服务器?
- python - Tkinter 之间的区别
和 < > - angular - 如何使用 Angular 在 ngOnInit() 中设置 FormGroup 和 FormControl?
- java - 如何从 unicode 字符范围打印 utf-8 字符?
- erd - 如何在实体关系图 (ERD) 中合并实体
- javascript - Node.JS / Passport / Sequelize - 使用错误密码登录
- android - 其他 Edittext 更改时更新 Edittext
- web-scraping - 在使用 servlet 的页面上使用 requests.get()