我目前正在尝试编写一个小程序来跟踪员工的休假请求。我是MYSQL和PHP的新手,所以这对我来说也是一个学习项目。我遇到了这个我似乎无法弄清楚的问题。
我想显示给定周(周一至周五)的请求时间。我在表'请求'中得到了请求,在单独的字段中有'Starttime'和'Endtime',都是日期/时间。
我目前可以轻松搜索和检索具有(或两者)Starttime或Endtime值的请求,这些请求属于我正在查看的给定ISO周(WEEKOFYEAR())。
我需要做的是搜索可能包含我正在显示的ISO周的天数的请求,但在该周内没有开始时间或结束时间。
示例:
员工在第24周的周二到第24周的周五起飞。
目前,我会正确地显示该员工周二开始并在该周五显示回报,但在周三和周四不会输入任何内容。
员工在第30周的周五至第32周的周一起飞。
目前,我会在第31周时显示该员工没有“关闭”,因为搜索在该周内不会显示Starttime或Endtime,即使他们实际上是整个星期都没有。虽然会在正确的日期记录开始时间和结束时间。
现在,我要解决的问题是运行5个额外的查询,以检查第31周中每周一至周五的日期是否包含在数据库中每个请求的开始时间和结束时间之间。
我讨厌共运行6个查询来获取此信息。有没有更简单的方法来获取这些信息?
答案 0 :(得分:1)
我刚刚为事件编写了一个日历应用程序并遇到了这样的问题:
SELECT * FROM Requests WHERE
Start_Date BETWEEN <first_day_of_week> AND <last_day_of_week>
OR
End_Date BETWEEN <first_day_of_week> AND <last_day_of_week>
OR
<day_of_week_monday> BETWEEN Start_Date AND End_Date
OR
<day_of_week_tuesday> BETWEEN Start_Date AND End_Date
OR
<day_of_week_wedenesday> BETWEEN Start_Date AND End_Date
OR
<day_of_week_thursday> BETWEEN Start_Date AND End_Date
OR
<day_of_week_friday> BETWEEN Start_Date AND End_Date
GROUP BY ID ORDER BY Start_Date ASC, Date ASC
虽然&lt; value_names&gt;是通过当前查看的请求周生成的PHP。应该覆盖你的基地。
答案 1 :(得分:0)
这些日期存储在数据库中的格式是什么?假设他们使用MySQL的DATE格式,那很容易做到。您可以在字段上使用比较运算符,MySQL将在一个查询中为您完成工作。
$sql = "SELECT * FROM table WHERE startdate <= $someday AND $someday <= enddate";
答案 2 :(得分:0)
坚持一年的方式,你可以检查当前周是否在开始周休息和结束休息的范围内。
SELECT * FROM table WHERE WEEKOFYEAR(Starttime) <= N AND WEEKOFYEAR(Endtime) >= N;
(其中N是您要显示的那一周)
一旦获得行,您想要做的就是每天在PHP中解析,看看那天是否在开始时间和结束时间之间。
一个很好的方法是使用:
$start_timestamp = strtotime($row['Starttime']);
$end_timestamp = strtotime($row['Endtime']);
您可以使用类似的方法获取当前显示日期的时间戳,并查看它是否介于$ start_timestamp和$ end_timestamp之间,以确定该日期是否已关闭。
答案 3 :(得分:0)
因为您提到PHP作为显示:
$start=30; //Friday of Week 30
$end=32; //Monday of Week 32
foreach (range($start, $end) as $number) {
echo $number;
}
你可能会得到30,31,32。
您必须验证$ start是否为&lt;也可以在12月到1月的周末结束。
WEEKOFYEAR()的范围是1-53。在这种情况下,如果大于53,则向$ end添加53并显示$ end的mod:
$start=52; //Friday of Week 52, 2009
$end=2; //Monday of Week 2, 2010
If($start>$end) $end+=53;
foreach (range($start, $end) as $number) {
if($number>53){
echo $number%53;}
else{
echo $number;
}
}
你希望得到52,53,1,2
答案 4 :(得分:0)
可能需要将查询读取为包含所有ORs
的大问题或类似的内容
WHERE
Starttime <= <value for last day/time of the week>
AND
Endtime >= <value for the first day/time of the week>
那应该得到可能所需的所有日期,然后你解析用 PHP 获得的记录来找到那个实际周的那些日期。 ..虽然可能有更简单的方法来做到这一点。