在mysql数据库中存储天数

时间:2012-08-12 17:43:40

标签: mysql

我想知道在mysql数据库中存储一周中几天的最有效方法。我有一个每周发生的事件列表,并希望以匹配日的列表格式返回它们。

我不确定哪种方式最适合这种方式,因为它不是特定日期而是一天?

4 个答案:

答案 0 :(得分:6)

对于您的特定情况,我会使用ENUM类型,它既可读又高效。

CREATE TABLE MY_TABLE
(
 -- other fields
  EVENT_DAY ENUM('SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY')
);

关于ENUM的好处是你可以编写易于阅读的查询(例如WHERE EVENT_DAY = 'FRIDAY')而不放弃性能,因为内部MySQL使用数字表示有效地存储数据。


为了扮演Devil's Advocate,Chris Komlenic写了一篇非常有趣的post推荐参考表而不是枚举。无论如何,我认为你的问题适合他的文章“可能使用枚举的标准”。一个模拟星期几的参考表听起来有点矫枉过正(我会选择TINYINT作为第二个选项)。

答案 1 :(得分:1)

将其存储为正常日期时间,并使用函数DAYOFWEEK()来确定它是哪一天。

例如,假设您要运行一个查询,该查询将返回应该在星期一发生的所有行:

SELECT event
FROM scheduled_events
WHERE DAYOFWEEK(event_datetime) = 2;

答案 2 :(得分:1)

另一个选项可以是使用ENUM字段以整数或字符串形式存储星期几。取决于您的具体实施。

答案 3 :(得分:1)

您可以将工作日及其标准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;
相关问题