我想知道在 mysql 数据库中存储星期几的最有效方法。我有一个每周发生的事件列表,并希望以列表格式将它们作为匹配日的时间表返回。
我不确定哪个是最好的解决方法,因为它不是一个特定的日期,而是一天?
我想知道在 mysql 数据库中存储星期几的最有效方法。我有一个每周发生的事件列表,并希望以列表格式将它们作为匹配日的时间表返回。
我不确定哪个是最好的解决方法,因为它不是一个特定的日期,而是一天?
对于您的特定场景,我会使用ENUM类型,它既可读又高效。
CREATE TABLE MY_TABLE
(
-- other fields
EVENT_DAY ENUM('SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY')
);
ENUM 的好处是您可以编写易于阅读的查询(例如,WHERE EVENT_DAY = 'FRIDAY'
)而不会放弃性能,因为 MySQL 在内部使用数字表示有效地存储数据。
只是为了扮演魔鬼的拥护者,Chris Komlenic 写了一篇非常有趣的帖子,推荐参考表而不是枚举。无论如何,我认为您的问题符合他的文章“何时可以使用枚举的标准”。一个星期几的模型参考表听起来有点矫枉过正(我会选择TINYINT
第二个选项)。
您可以将工作日及其标准 ODBC 索引号存储在表中。(始终使用 INNODB 引擎。)
create table weekdays (
weekday_num integer primary key,
day_of_week char(3) not null,
unique (day_of_week)
);
-- Values correspond to return values from the dayofweek() function.
insert into weekdays values (1, 'Sun');
insert into weekdays values (2, 'Mon');
insert into weekdays values (3, 'Tue');
insert into weekdays values (4, 'Wed');
insert into weekdays values (5, 'Thu');
insert into weekdays values (6, 'Fri');
insert into weekdays values (7, 'Sat');
如果应用程序需要在列表中显示这些天数和它们的索引,它们只需在数据库中查询正确的值。(或者通过查询数据库生成代码make <your_program_name>
。)
然后创建一个重复事件表。
create table recurring_events (
event_name varchar(20) primary key,
day_of_week char(3) not null,
foreign key (day_of_week) references weekdays (day_of_week)
);
insert into recurring_events values
('Trash pickup', 'Mon'),
('Bookmobile', 'Mon'),
('Grocery store', 'Wed'),
('Tutoring', 'Fri');
使用连接意味着 dbms 应该能够避免为表中的每一行评估 dayofweek()。
select e.*
from recurring_events e
inner join weekdays w on e.day_of_week = w.day_of_week
and dayofweek(current_date) = w.weekday_num;
另一种选择是使用该ENUM
字段以整数或字符串形式存储星期几。取决于您的特定实现。
将其存储为正常的日期时间,并使用该函数DAYOFWEEK()
确定它是星期几。
例如,假设您要运行一个查询,该查询将返回应该在星期一发生的所有行:
SELECT event
FROM scheduled_events
WHERE DAYOFWEEK(event_datetime) = 2;