我需要提出一种能够将员工的日程安排存储在数据库中的软件。我目前有这个设计:
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 ;
非常直接。打印今天的日期,找出一周中的哪一天,并从数据库中检索所有匹配项,但我想知道更好的方法来实现相同的目标。
我需要在日历上显示员工的日程安排,我需要将日期传递给日历才能显示。但是,如果我知道的唯一信息是特定员工将在周三工作,我就无法将日期传递给日历。
鉴于后一种数据库设计,有没有办法检索所有星期三或一个月/一年的星期一?
谢谢!
修改
我需要帮助倒退(或更好的替代方案)将一周中的某一天更改为实际日期。
这些是我的“限制”:
例如: 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编码了一个数组,而Calendar控件终于像魅力一样工作了。
答案 0 :(得分:3)
您可以创建日期表并使用该表中的键并存储在此处。日期表允许您按不同的日期变量查询数据,例如:day, week, day of week, quarter
等 - dwhworld.com/2010/08/date-dimension-sql-scripts-mysql
您的schedules
表格会id, emplid, date_id
,您可以schedules
加date
schedules.date_id = datetble.date_id
{{1}}表,并在一个查询中获取日期,星期几。然后,您可以将此日期字段与控件一起使用
答案 1 :(得分:1)
为什么不将 day_of_week 列改为日期类型,这样如果您希望从此日期开始,您可以使用MySQL的DayOfWeek功能。您可以使用相同的日期传递到您的日历控件(我认为这就是您所获得的内容)。
详细说明您的评论:John Doe计划工作的日期不会由用户输入(可能通过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 - 从这里你可以在SQL中查询你的DayOfWeek并返回一个整数数组,你可以将它作为第三个参数传递给它们的函数。