【问题标题】:Display dates from Leave Date and From and to date [duplicate]显示从休假日期和开始日期到截止日期的日期[重复]
【发布时间】:2019-06-09 05:50:16
【问题描述】:

我有两张表,一张有员工姓名、员工 id,另一张是 tblleaves,有 empid、Leave_Date、fromDate、toDate、Description。

如果员工选择一个日期休假,则将日期值存储到 Leave_Date,如果员工选择多个日期,则存储从日期到至今的值。

我想要员工姓名、休假天数和休假日期的输出页面。 Leave Dates 的日期为 Leave_date、FromDate 和 ToDate。

<?php 


        if(isset($_POST['apply'])){

        $ym=$_POST['month'];
        list($Year, $Month) = explode("-", "$ym", 2);

        $sql = "SELECT 
       tblemployees.FirstName,
       tblemployees.LastName,
       count(tblleaves.empid) as Leave_Days,
       GROUP_CONCAT( tblleaves.Leave_Date SEPARATOR ', ' ) AS leave_dates
    FROM
       tblleaves
       JOIN tblemployees
          ON tblleaves.empid = tblemployees.id
    WHERE YEAR(Leave_Date) = $Year
       AND MONTH(Leave_Date) = $Month
    GROUP BY tblemployees.EmpId";

        $query = $dbh -> prepare($sql);
        $query->execute();
        $results=$query->fetchAll(PDO::FETCH_OBJ);

        $cnt=1;
        if($query->rowCount() > 0)
        {
        foreach($results as $result)
        {               ?>  
          <tr>
            <td> <?php echo htmlentities($cnt);?></td>
              <td><?php echo htmlentities($result->FirstName);?>&nbsp;<?php echo htmlentities($result->LastName);?></td>
               <td><?php echo htmlentities($result->Leave_Days);
     ?></td>
<td><?php echo htmlentities($result->leave_dates);

    ?></td><?php $cnt++;}}}?>
</tr>
</tbody>
</table>

我想要的输出:

  employee name     Leave Days      Leave Dates 
    KrishnanR            3              12-06-2019, 13-06-2019, 14-06-2019
                                         (FromDate and ToDate)
    PrakashR             1              12-06-2019
                                         (Leave_Date)

    SelvaK               3       12-06-2019,13-06-2019&14-06-2019|14-06-2019
                                     (FromDate and ToDate) (Leave_Date)

【问题讨论】:

  • 帮我找答案的朋友
  • 错误在你的查询中,tblemployees.idtblemployees.EmpId 同一个表名有第二个表列名。如果你改变这应该工作我认为
  • 我改变了我想打印给定的输出
  • 想要从日期到日期的日期在输出中看到我想帮我找到它
  • @Krishnan R SELECT CONCAT(te.FirstName, te.LastName) as employee_name, SUM(DATEDIFF(tl.toDate,tl.fromDate)+IF(DATEDIFF(tl.toDate,tl.fromDate)!='',1,0)) as Leave_Days, GROUP_CONCAT(tl.fromDate,',',tl.toDate) as Leave_Dates from tblemployees te join tblleaves tl on tl.empid = te.id where DATEDIFF(tl.toDate,tl.fromDate)!='' GROUP BY employee_name; 此查询将准确给出您的期望姓名、每位员工所有天数的总和、Cocat 所有休假日期

标签: php mysql date mysqli


【解决方案1】:

无法帮助您处理 php,但 mysql 查询可以解决问题。

DROP TABLE IF EXISTS T;
CREATE TABLE T
(ID INT AUTO_INCREMENT PRIMARY KEY,NAME VARCHAR(10),LEAVE_DATE DATE, LEAVE_FROM DATE, LEAVE_TO DATE);
INSERT INTO T (NAME,LEAVE_DATE,LEAVE_FROM,LEAVE_TO) VALUES
('A','2019-05-30','2019-05-30','2019-06-02'),
('A','2019-06-05',NULL,NULL),
('A','2019-06-06',NULL,NULL),
('A','2019-06-30','2019-06-30','2019-07-11'),
('B','2019-05-30','2019-05-30','2019-07-11'),
('C','2019-05-11','2019-05-11','2019-05-12')
;

SELECT NAME,
         SUM(CASE WHEN LEAVE_FROM IS NULL THEN 1 
                ELSE DATEDIFF(IF(LEAVE_TO > '2019-06-30','2019-06-30',LEAVE_TO),IF(LEAVE_FROM < '2019-06-01','2019-06-01',LEAVE_FROM)) + 1 
              END) LEAVEDAYS,
         GROUP_CONCAT(CASE WHEN LEAVE_FROM IS NULL THEN LEAVE_DATE 
                            ELSE CONCAT(IF(LEAVE_FROM < '2019-06-01','<<2019-06-01',LEAVE_FROM),' & ',IF(LEAVE_TO > '2019-06-30','2019-06-30>>',LEAVE_TO)) 
                            END) AS LEAVEDATES 
FROM T
WHERE (LEAVE_DATE BETWEEN '2019-06-01' AND '2019-06-30') OR
        (LEAVE_FROM BETWEEN '2019-06-01' AND '2019-06-30') OR
        (LEAVE_TO   BETWEEN '2019-06-01' AND '2019-06-30') OR
        (LEAVE_FROM < '2019-06-01' AND LEAVE_TO > '2019-06-30')
GROUP BY NAME
ORDER BY ID;

请注意对休假日期顶部和底部的调整,以确保我们只计算该期间的日期。另请注意,我在休假日期中添加了指示符(>),以指示在所需期间开始日期之前开始或在所需期间结束日期之后延长的休假日期。

+------+-----------+---------------------------------------------------------------------------+
| NAME | LEAVEDAYS | LEAVEDATES                                                                |
+------+-----------+---------------------------------------------------------------------------+
| A    |         5 | <<2019-06-01 & 2019-06-02,2019-06-05,2019-06-06,2019-06-30 & 2019-06-30>> |
| B    |        30 | <<2019-06-01 & 2019-06-30>>                                               |
+------+-----------+---------------------------------------------------------------------------+
2 rows in set (0.08 sec)

【讨论】:

  • 我在另一个表中显示了员工详细信息
  • SELECT SUM(CASE WHEN FromDateISNULLTHEN1ELSEDATEDIFF(IF(ToDate > '2019-06-30','2019-06-30',ToDate),IF(FromDate '2019-06-30','2019-06-30>>',ToDate)) END) AS LEAVEDATES FROM tblleaves WHERE (Leave_Date BETWEEN '2019-06-01' AND '2019-06-30') OR (FromDate BETWEEN '2019-06-01' AND '2019-06-30') OR (ToDate BETWEEN '2019-06-01' AND '2019-06-30') OR ( FromDate '2019-06-30') GROUP BY empid
  • 我试过这个代码但是输出是 LEAVEDAYS LEAVEDATES -2
  • 帮我找到它
  • 你真的认为我会从不受信任的来源下载吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多