2012-08-06 94 views
0

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

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 ; 

非常直截了当。打印今天的日期,找出一周中的星期几,并从数据库中检索所有匹配,但我想知道更好的方法来实现相同的目标。

我需要在日历上显示员工的时间表,我需要将日期传递给日历才能显示。但是,如果我知道的唯一信息是特定员工将在星期三工作,那么我无法将日期传递给日历。

鉴于后者的数据库设计,有没有办法检索所有星期三或一个月/一个星期一?

谢谢!

编辑

我需要帮助倒退(或更好的替代)来改变星期来实际日期。

这些都是我的“限制”:

  • 我的日历控件需要,以显示在用户界面中的“事件”的日期。
  • 员工只需提交一次他们的日程安排。

例如: 约翰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给定月份。

比如我应该能够拿出一个办法来告诉我的日历控件: 李四打算6日,13日,20日上班,和27也要考虑到我的唯一信息是“ DAY_OF_WEEK” = 1(星期一)

EDIT 2

我的电流,但丑陋的解决方案是: 遍历整个5月的天,按天查询数据库的一天。

编辑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编码的数组,日历控件终于像魅力一样工作。

+0

您可以创建日期表并使用该表中的密钥并存储在此处。日期表将允许您通过不同的日期变量查询数据,例如:日,星期,星期几,季度等 - http://www.dwhworld.com/2010/08/date-dimension-sql-scripts-mysql/ – 2012-08-06 15:04:18

+0

你能再详细一点,我想我或多或少都能理解你的观点。 – ILikeTacos 2012-08-06 15:07:37

+0

SELECT * FROM schedule WHERE day_of_week = DAYOFWEEK('2007-02-03');将允许您获取特定日期的时间表。 DAYOFWEEK给出了1-Monday到7-Sunday(不同于php的日期(),这是周日到周六) – Waygood 2012-08-06 15:09:15

回答

2

您可以创建日期表并使用该表中的密钥并存储在此处。日期表让您能够通过不同的日期变量来查询数据,例如: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并在一个查询中获取日期,星期几。然后,您可以使用此日期字段与您的控件

1

,如果你想从这个日期,你可以使用MySQL的DayOfWeek功能那天为什么没有你DAY_OF_WEEK日期类型相反,这种方式。你可以在你的用户界面中使用这个日期传递给你的日历控件(我认为你就是这么做的)。

为了详细说明您的评论:那不是李四被安排工作的日期由用户(可能通过jQuery UI's datepicker)进入,然后在UI级别渲染你的日程安排,当你要使用以下的查询检索其周一的日程安排:

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

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

RE:编辑

好了,现在我明白你的意思。基本上,你在追踪一个函数,它会给你所有日期在两个范围之间(也许)在特定的一天(假设星期一)着陆。看起来这个has already been done in PHP这样可能会有用吗?或者确实有一个特定的技术,这需要在?

编辑3

这似乎是一个更优雅的解决方案:Get mondays tuesdays etc - 这个,你可以查询你的DAYOFWEEK在SQL并返回一个可以传递的第三个参数的函数整数数组。

+0

不是这方面的粉丝,因为DOW是所需的工作价值,所以对于计划中的每个条目都是不必要的。 – Waygood 2012-08-06 15:12:51

+0

@Waygood我不确定的是,他们指的是哪一周?什么时间?我看不到该表中的日期列。我知道他们已经说过“打印今天的日期”,所以我认为他们总是会在本周进行。这极大地限制了他们程序的范围,那么历史数据呢?如果有要求查看谁在过去的X个月里工作过,该怎么办?我认为,尽管每次计算DOW的开销很小,但对于潜在的功能增益来说是值得的。 – 2012-08-06 15:20:50

+0

了解DayOfWeek的功能不是问题,我的问题正在倒退,或者我不知道我是否不明白。 最终用户只需要将他/她的日程安排一次,我不希望最终用户每周都安排他/她的日程安排。 – ILikeTacos 2012-08-06 15:20:52

相关问题