1

我需要想出一个能够将员工的日程表存储在数据库中的软件。我目前有这样的设计:

 CREATE TABLE IF NOT EXISTS `schedules` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `employee_id` varchar(32) NOT NULL,
   `day_of_week` int(2) NOT NULL,
   `starting_time` time DEFAULT NULL,
   `ending_time` time DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

很直接。打印今天的日期,找出星期几,并从数据库中检索所有匹配项,但我想知道实现相同目标的更好方法。

我需要在日历上显示员工的日程安排,并且需要将日期传递给日历才能显示。但是,如果我知道的唯一信息是某个特定员工将在周三上班,我无法将日期传递给日历。

考虑到后一种数据库设计,有没有办法检索一个月/年的所有星期三或星期一?

谢谢!

编辑

我需要帮助(或更好的选择)将星期几更改为实际日期。

这些是我的“限制”:

  • 我的日历控件需要一个日期才能在 UI 中显示“事件”。
  • 员工应该只提交一次他们的日程安排。

例如:John Doe 每周一、周三和周五工作。8:00 - 12:00。

使用我当前的数据库设计,该信息以以下方式表示:

ID, employee_id, day_of_week, starting_time, ending_time
1, John Doe, 1, 8:00, 12:00
2, John Doe, 3, 8:00, 12:00
3, John Doe, 5, 8:00, 12:00

我需要能够将给定月份的日期传递给日历 UI。

例如,我应该能够想出一种方法来告诉我的日历控件:John Doe 将在 6 日、13 日、20 日和 27 日工作,考虑到我拥有的唯一信息是 "day_of_week" = 1 (星期一)

编辑 2

我目前但丑陋的解决方案是:遍历一个月中的所有日子,并逐日查询数据库。

编辑 3 - 解决方案

感谢RS,我能够解决我的问题。我保持schedules表原样,但我创建了rs建议的表 在创建rs 共享的文章中描述的表之后 ,以下查询完成了这项工作:

 SELECT CONCAT(users.firstname,\" \",users.lastname) as employee_name, 
 DATE_FORMAT(DATE, '%a %b %d %Y') as date, schedules.starting_time,
 schedules.ending_time FROM dates_d 
 RIGHT JOIN schedules ON schedules.day_of_week = dates_d.day_of_week
 LEFT  JOIN users ON schedules.employee_id = users.ID

我对一个数组进行了 JSON 编码,日历控件终于像魅力一样工作了。

4

2 回答 2

3

您可以创建日期表并使用该表中的密钥并存储在这里。日期表将允许您通过不同的日期变量查询数据,例如:day, week, day of week, quarter等 - dwhworld.com/2010/08/date-dimension-sql-scripts-mysql

您的schedules表将有id, emplid, date_id,您可以在一个查询中加入schedulesdateschedules.date_id = datetble.date_id获取日期、星期几。然后,您可以将此日期字段与您的控件一起使用

于 2012-08-06T19:23:56.810 回答
1

为什么不让你的day_of_week列改为日期类型,这样如果你想从这个日期获取日期,你可以使用 MySQL 的DayOfWeek函数。您可以使用相同的日期传递到您的 UI 中的日历控件(我认为这就是您所得到的)。

详细说明您的评论:用户不会输入 John Doe 计划工作的日期(可能通过jQuery UI 的 datepicker),然后在 UI 级别呈现您的日程安排时,您将使用以下查询来检索他们的周一日程:

SELECT * 
FROM schedules 
WHERE DAYOFWEEK(schedule_date) = 1
AND employee_id = (
    SELECT employee_id
    FROM employees
    WHERE employee_name = 'John Doe'
)

显然,这个查询对您的雇员表做了一些假设,它不是特别优雅,但它可以解释我的意思。

回复:编辑

好的,现在我明白你的意思了。基本上,您正在使用一个函数,该函数将为您提供两个范围(可能)之间的所有日期,这些日期位于指定的日期(比如说星期一)。似乎这 已经在 PHP 中完成了,所以这可能有用吗?或者确实有一个特定的技术需要这样做?

编辑 3

这似乎是一个更优雅的解决方案:获取 mondays tuesdays 等- 从中​​您可以在 SQL 中查询 DayOfWeek 并返回一个整数数组,您可以将其作为第三个参数传递给它们的函数。

于 2012-08-06T15:07:16.433 回答