Php 日期查询与显示

Php 日期查询与显示,php,sql,mysql,date,Php,Sql,Mysql,Date,我目前正在尝试编写一个小程序来跟踪员工的休假请求。我对MYSQL和PHP相当陌生,所以这对我来说也是一个学习项目。我遇到了这个问题,我似乎无法解决 我想显示给定一周(周一至周五)的休假请求。我将请求放在“requests”表中,在单独的字段中有“Starttime”和“Endtime”,这两个字段都是日期/时间 目前,我可以轻松搜索和检索在给定ISO周(WEEKOFYEAR())内具有Starttime或Endtime(或两者)值的请求 我需要能够做的是搜索请求,这些请求可能包括我显示的ISO周

我目前正在尝试编写一个小程序来跟踪员工的休假请求。我对MYSQL和PHP相当陌生,所以这对我来说也是一个学习项目。我遇到了这个问题,我似乎无法解决

我想显示给定一周(周一至周五)的休假请求。我将请求放在“requests”表中,在单独的字段中有“Starttime”和“Endtime”,这两个字段都是日期/时间

目前,我可以轻松搜索和检索在给定ISO周(WEEKOFYEAR())内具有Starttime或Endtime(或两者)值的请求

我需要能够做的是搜索请求,这些请求可能包括我显示的ISO周中的天,但在该周中没有开始时间或结束时间

例如:

  • 员工从第24周的星期二到第24周的星期五休假

    目前,我会正确地显示员工从星期二开始休假,并在星期五显示返回,但在星期三和星期四不会输入任何内容

  • 员工从第30周的星期五到第32周的星期一休假

    目前,我会将该员工显示为在第31周内未“关闭”,因为搜索不会显示该周的开始时间或结束时间,即使他们实际上在整个星期内关闭。虽然开始时间和结束时间会在正确的日期标注

  • 现在,我要做的是运行5个额外的查询来检查第31周的Mon-Fri每天的日期是否包含在db中每个请求的开始时间和结束时间之间


    我讨厌总共运行6个查询来获取这些信息。有没有更简单的方法来获取这些信息?

    数据库中存储的日期是什么格式?假设他们使用的是MySQL的格式,这很容易做到。您可以在字段上使用比较运算符,MySQL将在一个查询中为您完成这项工作

    $sql = "SELECT * FROM table WHERE startdate <= $someday AND $someday <= enddate";
    

    $sql=“SELECT*FROM table WHERE startdate坚持一年中的一周方式,您可以运行一次检查,查看当前一周是否在开始休息周和结束休息周的范围内

    SELECT * FROM table WHERE WEEKOFYEAR(Starttime) <= N AND WEEKOFYEAR(Endtime) >= N;
    

    您可以使用类似的方法获取所显示日期的时间戳,并查看它是否介于$start\u timestamp和$end\u timestamp之间,以确定该日期是否已结束。

    我刚刚为事件编写了一个日历应用程序,并遇到了以下情况-类似这样的情况如何:

    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
    
    从请求中选择*,其中
    开始日期介于和之间
    或
    结束日期介于和之间
    或
    在开始日期和结束日期之间
    或
    在开始日期和结束日期之间
    或
    在开始日期和结束日期之间
    或
    在开始日期和结束日期之间
    或
    在开始日期和结束日期之间
    按ID分组按开始日期ASC、日期ASC排序
    

    是通过当前查看的请求周使用php生成的。应该涵盖您的基本信息。

    因为您提到了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是否小于$end,但在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

    可能需要将查询读取为包含所有
    or
    的大查询或类似的内容

    WHERE 
    Starttime <= <value for last day/time of the week> 
    AND
    Endtime >= <value for the first day/time of the week>
    
    在哪里
    开始时间=
    

    这应该会得到你需要的可能在那一周的所有日期,然后你用PHP解析你得到的记录,找到那一周的记录……虽然有一种更简单的方法可以做到这一点。

    当然你可以使用weekofyear函数,而不是所有的单独日期——但这将排除你的星期六和星期日ned。这可能是好的,也可能不是好的,这取决于你的应用程序的限制-但周一到周五都有,这样你就可以看到发生了什么,以及为什么你不能错过这个好把戏的dat。不过,是否需要全部5天的测试。因为前两个测试会带来有开始或结束(或两者都有)的事件在感兴趣的一周内,只需检查星期一是否在偶数的开始和结束日期之间,就足以选择一周内的事件(开始和结束都在一周之外)?@mjv-True。我想不出一个理由让你需要检查超过一天…很好的捕获!如果有比周末更好的方法,让我知道。我对任何事情都持开放态度!一年中的一周都可以,它从数据库中获取你需要的东西。然后你可以在PHP中单独解析每一天。让数据库做所有这些事情很有诱惑力e工作,但实际上,它更具可扩展性,只需从数据库中获取数据,并让PHP处理。它也更易于记录,因此您可以在以后更改和更新它,而不需要太多麻烦。然而,如果我仔细阅读,我会看到J已经说了很多,而这看起来只是一个小把戏。。。
    WHERE 
    Starttime <= <value for last day/time of the week> 
    AND
    Endtime >= <value for the first day/time of the week>