如果可能,如何在mysql查询中重写值
我尝试将员工的工作时间存储在mysql表中。在表如果可能,如何在mysql查询中重写值,mysql,Mysql,我尝试将员工的工作时间存储在mysql表中。在表working_hour中,我存储了正常工作时间: id employee weekDay start end 1 1 2 10:00:00 18:00:00 2 1 3 10:00:00 18:00:00 3 1 4 10:00:00 14:00:00 4 1 5 10:00:00 12:00:00 5
working_hour
中,我存储了正常工作时间:
id employee weekDay start end
1 1 2 10:00:00 18:00:00
2 1 3 10:00:00 18:00:00
3 1 4 10:00:00 14:00:00
4 1 5 10:00:00 12:00:00
5 1 6 10:00:00 18:00:00
6 1 7 00:00:00 00:00:00
7 1 1 00:00:00 00:00:00
在第二张表中,我存储“特殊”工作时间。在那里,我储存疾病、假期或某一天的定制工作时间等信息。working\u hour\u special
l表如下所示:
id start end type
2 12013-03-12 00:00:00 2013-03-13 23:59:59 ill
这就是我尝试过的:
SELECT
IFNULL(working_hour_special.start, working_hour.start) AS startTime,
IFNULL(working_hour_special.end, working_hour.end) AS endTime,
type
FROM
working_hour_special LEFT JOIN
working_hour ON working_hour.employee_id = working_hour_special.employee_id
WHERE
working_hour_special.start = DATE('2013-03-13') AND
employee_id = 1 AND
working_hour.weekDay = DAYOFWEEK('2013-03-13')
问题是WHERE子句。我需要特定员工特定日期的开始和结束时间。有人知道怎么做吗?首先,桌子的设计似乎很糟糕。一周中只有一天,而另一周中有完整的日期/时间戳。1月1日的第1周与7月26日的第1周没有区别 其次,当您有一个左连接,然后将该表抛出到WHERE子句中(不考虑NULL测试),它基本上会创建一个正常的内部连接 因此,您可能要寻找的是将与特殊关联的WHERE组件转移到条件的连接部分。。。差不多
SELECT
IFNULL(working_hour_special.start, working_hour.start) AS startTime,
IFNULL(working_hour_special.end, working_hour.end) AS endTime,
type
FROM
working_hour_special
LEFT JOIN working_hour
ON working_hour.employee_id = working_hour_special.employee_id
AND working_hour_special.start = DATE('2013-03-13')
WHERE
employee_id = 1
AND working_hour.weekDay = DAYOFWEEK('2013-03-13')
你到底想要实现什么?有什么问题吗?如何将日期从
特别工作时间
匹配到工作时间
?@Obl Tobl:我尝试获取特定员工的工作时间。如果没有“特殊”,比如疾病或假期,我需要正常的工作时间来约会。哪种桌子设计更好?我需要存储正常工作时间,还需要存储疾病或假期等其他信息。@ThomasSchiela,我会将所有信息都放在一个列中,并显示状态,例如,表示正常时间、随时间变化、疾病、假期等等。此外,还有完整的日期/时间与星期几。您始终可以从日期开始计算星期几。那么查询是从一个表中进行的还是不进行的。将所有信息存储在一个表中是我的第一个想法。但我认为我有很多员工的记录(~1000),因为我需要未来2-3个月的信息。对于两个表,我只存储“标准”周和一些额外的“特殊”日。@ThomasSchiela、SQL(MySQL和其他)如果设计得好,并且有适当的索引来匹配查询上下文,其中子句没有问题,即使有数百万条记录。所以,真的要把事情分开,弄得一团糟,或者让引擎更好地为你处理。