ต้องแก้ไข Code อย่างไร จึงจะรองรับการ Export Table เป็น Excel ในรูปแบบ รวมตาราง status = start กับ finish ได้

ถาม-ตอบ แนะนำไอเดียว โค้ดตัวอย่าง แนวทาง วิธีแก้ปัญหา ต้องแก้ไข Code อย่างไร จึงจะรองรับการ Export Table เป็น Excel ในรูปแบบ รวมตาราง status = start กับ finish ได้

ต้องแก้ไข Code อย่างไร จึงจะรองรับการ Export Table เป็น Excel ในรูปแบบ รวมตาราง status = start กับ finish ได้
ต้องแก้ไข Code อย่างไร จึงจะรองรับการ Export Table เป็น Excel ในรูปแบบ รวมตาราง status = start กับ status = finish ใน number , name , date เดียวกัน ได้ครับ

ชุดไฟล์ + Code ทั้งหมดครับ

เพิ้มเติม : บรรทัดตรง  
header $strExcelFileName ไม่มี Backslash ให้พิมพ์ตามรูปด้านล่างครับ


 
 
1. testdata.sql (ชื่อ database คือ testdata ครับ)

CREATE TABLE `testdata` (
  `IDrun` int(100) NOT NULL,
  `IDrun2` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `IDnumber` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `Name` longtext COLLATE utf8_unicode_ci NOT NULL,
  `Work1` longtext COLLATE utf8_unicode_ci NOT NULL,
  `Work2` longtext COLLATE utf8_unicode_ci NOT NULL,
  `MyTime` longtext COLLATE utf8_unicode_ci NOT NULL,
  `logtime` longtext COLLATE utf8_unicode_ci NOT NULL,
  `logdate` longtext COLLATE utf8_unicode_ci NOT NULL,
  `sortdate` longtext COLLATE utf8_unicode_ci NOT NULL,
  `sortdate2` date NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `testdata` (`IDrun`, `IDrun2`, `IDnumber`, `Name`, `Work1`, `Work2`, `MyTime`, `logtime`, `logdate`, `sortdate`, `sortdate2`) VALUES
(74, 'aaaaaa', '111111', 'aaaaaa', '', '', 'Start', '07:00:00', '13-04-2563', '2563-04-13', '2020-04-13'),
(75, 'bbbbbb', '222222', 'bbbbbb', '', '', 'Start', '08:00:00', '13-04-2563', '2563-04-13', '2020-04-13'),
(76, 'bbbbbb', '222222', 'bbbbbb', '', '', 'Finish', '16:00:00', '13-04-2563', '2563-04-13', '2020-04-13'),
(77, 'aaaaaa', '111111', 'aaaaaa', '', '', 'Finish', '18:00:00', '13-04-2563', '2563-04-13', '2020-04-13'),
(78, 'cccccc', '333333', 'cccccc', '', '', 'Start', '08:00:00', '14-04-2563', '2563-04-14', '2020-04-14'),
(79, 'dddddd', '444444', 'dddddd', '', '', 'Start', '08:00:00', '14-04-2563', '2563-04-14', '2020-04-14'),
(80, 'dddddd', '444444', 'dddddd', '', '', 'Finish', '16:00:00', '14-04-2563', '2563-04-14', '2020-04-14'),
(81, 'cccccc', '333333', 'cccccc', '', '', 'Finish', '16:00:00', '14-04-2563', '2563-04-14', '2020-04-14'),
(82, 'eeeeee', '555555', 'eeeeee', '', '', 'Finish', '20:00:00', '14-04-2563', '2563-04-14', '2020-04-14'),
(83, 'eeeeee', '555555', 'eeeeee', '', '', 'Start', '07:00:00', '14-04-2563', '2563-04-14', '2020-04-14');

ALTER TABLE `testdata`
  ADD PRIMARY KEY (`IDrun`);

ALTER TABLE `testdata`
  MODIFY `IDrun` int(100) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=86;

2. index.php

<?php
    $conn = mysqli_connect("localhost", "root", "", "testdata");
    mysqli_set_charset($conn, "utf8");
     
    $post_at = "";
    $post_at_to_date = "";
     
    $_post_at = (isset($_POST['search']['post_at'])) ? $_POST['search']['post_at'] : '';
    $_post_at_to_date = (isset($_POST['search']['post_at_to_date'])) ? $_POST['search']['post_at_to_date'] : '';
     
    $queryCondition = "";
    if(!empty($_POST["search"]["post_at"])) {           
        $post_at = $_POST["search"]["post_at"];
        list($fid,$fim,$fiy) = explode("-",$post_at);
       
        $post_at_todate = date('Y-m-d');
        if(!empty($_POST["search"]["post_at_to_date"])) {
            $post_at_to_date = $_POST["search"]["post_at_to_date"];
            list($tid,$tim,$tiy) = explode("-",$_POST["search"]["post_at_to_date"]);
            $post_at_todate = "$tiy-$tim-$tid";
        }
       
        $queryCondition .= "WHERE sortdate BETWEEN '$fiy-$fim-$fid' AND '" . $post_at_todate . "'";
    }
 
    $sql =  "SELECT * FROM testdata " . $queryCondition . " ORDER BY sortdate ASC, logtime ASC";
    $result = mysqli_query($conn,$sql);
?>
 
<html>
    <head>
    <meta charset="UTF-8">        
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
    <style>
    * {
        font-size: 24px;
    }
     
    .table-content{border-top:#CCCCCC 4px solid; width:80%; overflow-x:auto;}
    .table-content th {padding:5px 20px; background: #F0F0F0;vertical-align:top;} 
    .table-content td {padding:5px 20px; border-bottom: #F0F0F0 1px solid;vertical-align:top;}  
    </style>
    </head>
     
    <body><center>
    <div class="demo-content">
  <form name="frmSearch" method="POST" action="">
     <p class="search_input">
        <input type="text" placeholder="From Date" id="post_at" name="search[post_at]" value="<?php echo $post_at; ?>" class="input-control" />&nbsp;&nbsp;
        <input type="text" placeholder="To Date" id="post_at_to_date" name="search[post_at_to_date]" style="margin-left:10px"  value="<?php echo $post_at_to_date; ?>" class="input-control" /><br>    
        <input type="submit" name="go" value="Search" >&nbsp;&nbsp;&nbsp;&nbsp;
        <a href = "excel2.php?search[post_at]=<?=$_post_at?>&search[post_at_to_date]=<?=$_post_at_to_date?>&go=Search">Export to Excel</a>
    </p>
    <?php if(!empty($result)) { ?>
    <table class="table-content">
        <thead>
        <tr>
        <th><div align="center">number </div></th>
        <th style="width:22%"><div align="center">name </div></th>
        <th><div align="center">cc </div></th>
        <th><div align="center">ee </div></th>
        <th style="width:15%"><div align="center">date </div></th>
        <th><div align="center">status </div></th>
        <th><div align="center">time </div></th>
        </tr>
      </thead>
    <tbody>
    <?php
        while($row = mysqli_fetch_array($result)) {
    ?>
        <tr>
        <td><div align="center"><?php echo $row["IDnumber"];?></div></td>
        <td><div align="left"><?php echo $row["Name"];?></div></td>
        <td><div align="center"><?php echo $row["Work1"];?></div></td>
        <td><div align="center"><?php echo $row["Work2"];?></div></td>
        <td><div align="center"><?php echo $row["logdate"];?></div></td>
        <td><div align="center"><?php echo $row["MyTime"];?></div></td>
        <td><div align="center"><?php echo $row["logtime"];?></div></td>
        </tr>
   <?php
        }
   ?>
   <tbody>
  </table>
<?php } ?>
  </form>
  </div>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<script>
    $.datepicker.setDefaults({
    dateFormat: 'dd-mm-yy',
    showOn: 'button',
    buttonImage: "datepicker.png",
        buttonImageOnly: false,
        dayNamesMin: ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'], 
        monthNamesShort: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน','กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
        changeMonth: true,
        changeYear: true,
        beforeShow:function(){  
            if($(this).val()!=""){
                var arrayDate=$(this).val().split("-");     
                arrayDate[2]=parseInt(arrayDate[2])-543;
                $(this).val(arrayDate[0]+"-"+arrayDate[1]+"-"+arrayDate[2]);
            }
            setTimeout(function(){
                $.each($(".ui-datepicker-year option"),function(j,k){
                    var textYear=parseInt($(".ui-datepicker-year option").eq(j).val())+543;
                    $(".ui-datepicker-year option").eq(j).text(textYear);
                });             
            },50);
        },
        onChangeMonthYear: function(){
            setTimeout(function(){
                $.each($(".ui-datepicker-year option"),function(j,k){
                    var textYear=parseInt($(".ui-datepicker-year option").eq(j).val())+543;
                    $(".ui-datepicker-year option").eq(j).text(textYear);
                });             
            },50);      
        },
        onClose:function(){
            if($(this).val()!="" && $(this).val()==dateBefore){         
                var arrayDate=dateBefore.split("-");
                arrayDate[2]=parseInt(arrayDate[2])+543;
                $(this).val(arrayDate[0]+"-"+arrayDate[1]+"-"+arrayDate[2]);    
            }       
        },
        onSelect: function(dateText, inst){ 
            dateBefore=$(this).val();
            var arrayDate=dateText.split("-");
            arrayDate[2]=parseInt(arrayDate[2])+543;
            $(this).val(arrayDate[0]+"-"+arrayDate[1]+"-"+arrayDate[2]);
        }   
    });
 
    $(function() {
    $("#post_at").datepicker();
    $("#post_at_to_date").datepicker();
    });
</script>
</center>
</body></html>

3. excel2.php

<?php
    //คำสั่ง connect db เขียนเพิ่มเองนะ
 
    $serverName = "localhost";
    $userName = "root";
    $userPassword = "";
    $dbName = "testdata";
 
    $conn = mysqli_connect($serverName,$userName,$userPassword,$dbName);
    mysqli_set_charset($conn,"utf8");
 
    $strExcelFileName="testdata.xls";
 
	header("Content-Type: application/x-msexcel; name="$strExcelFileName"");
	header("Content-Disposition: inline; filename="$strExcelFileName"");
	header("Pragma:no-cache");
     
    $post_at = "";
    $post_at_to_date = "";
      
    $queryCondition = "";
    if(!empty($_GET["search"]["post_at"])) {           
        $post_at = $_GET["search"]["post_at"];
        list($fid,$fim,$fiy) = explode("-",$post_at);
       
        $post_at_todate = date('Y-m-d');
        if(!empty($_GET["search"]["post_at_to_date"])) {
            $post_at_to_date = $_GET["search"]["post_at_to_date"];
            list($tid,$tim,$tiy) = explode("-",$_GET["search"]["post_at_to_date"]);
            $post_at_todate = "$tiy-$tim-$tid";
        }
       
        $queryCondition .= "WHERE sortdate BETWEEN '$fiy-$fim-$fid' AND '" . $post_at_todate . "'";
    }
 
    $sql = "SELECT * FROM testdata " . $queryCondition . " ORDER BY sortdate ASC, logtime ASC";
 
    $query = mysqli_query($conn,$sql);
?>
 
<html xmlns:o="urn:schemas-microsoft-com:office:office"xmlns:x="urn:schemas-microsoft-com:office:excel"xmlns="http://www.w3.org/TR/REC-html40">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
 
<body>
<strong>testdata</strong><br>
<br>
 
<div id="SiXhEaD_Excel" align=center x:publishsource="Excel">
<table x:str border=1 cellpadding=0 cellspacing=1 width=50% style="border-collapse:collapse">
<tr>
    <th><div align="center">number </div></th>
    <th><div align="center">name </div></th>
    <th><div align="center">cc </div></th>
    <th><div align="center">ee </div></th>
    <th><div align="center">date </div></th>
    <th><div align="center">status </div></th>
    <th><div align="center">time </div></th>
</tr>
 
<?php
while($result=mysqli_fetch_array($query,MYSQLI_ASSOC))
{
?>
 
<tr>
    <td><div align="center"><?php echo $result["IDnumber"];?></div></td>
    <td><div align="left"><?php echo "&nbsp;&nbsp;".$result["Name"];?></div></td>
    <td><div align="center"><?php echo $result["Work1"];?></div></td>
    <td><div align="center"><?php echo $result["Work2"];?></div></td>
    <td><div align="center"><?php echo $result["logdate"];?></div></td>
    <td><div align="center"><?php echo $result["MyTime"];?></div></td>
    <td><div align="center"><?php echo $result["logtime"];?></div></td>
</tr>
 
<?php
}
?>
 
</table>
</div>
 
<script>
window.onbeforeunload = function(){return false;};
setTimeout(function(){window.close();}, 10000);
</script>
</body>
</html>

4. datepicker.png โหลดได้ที่ Link ด้านล่างครับ
 
โครงสร้าง File ทังหมด มีดังนี้ครับ



Screenshot 1 ที่อธิบายว่า เลือกช่วงวันที่แล้ว ก่อนที่จะ Export เป็น Excel ครับ



Screenshot 2 ที่อธิบายว่า เมื่อ Export เป็น Excel แล้ว สามารถรวมตาราง status = start กับ status = finish ใน name เดียวกันได้ ตามกรอบสีแดงครับ




Sumate Mephokkij 159.192.223.xxx 16-04-2020 16:09:28

คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ


  • ( หรือ เข้าใช้งานด้วย Facebook คลิก )
 ความคิดเห็นที่ 1

ดูการคิวรี่นี้เป็นแนวทาง

SELECT 
t1.IDnumber as number,
t1.Name as name,
t1.Work1 as cc,
t1.Work2 as ee,
t1.logdate as date,
t1.MyTime as statusin,
t1.logtime as timein,
t2.MyTime as statusout,
t2.logtime as timeout
FROM testdata AS t1
LEFT JOIN testdata AS t2 ON t2.IDnumber = t1.IDnumber
GROUP BY t1.IDnumber,t1.MyTime,t2.MyTime,t1.logdate 
HAVING CONCAT(t1.MyTime,t2.MyTime) ='StartFinish'





Ninenik 223.24.159.xxx 16-04-2020
 ความคิดเห็นที่ 2
สอบถามกับคุณ Ninenik เพิ่มเติมว่า ได้ลองเขียน SQL Code ในความคิดเห็นที่ 1 ผ่าน phpmyadmin แล้วใช้ได้ ต่อมาได้นำ SQL Code มาประยุกต์เขียนแบบ php ตาม Code ด้านล่าง

1. testdata.sql (ชื่อ database คือ testdata ครับ)

CREATE TABLE `testdata` (
  `IDrun` int(100) NOT NULL,
  `IDrun2` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `IDnumber` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `Name` longtext COLLATE utf8_unicode_ci NOT NULL,
  `Work1` longtext COLLATE utf8_unicode_ci NOT NULL,
  `Work2` longtext COLLATE utf8_unicode_ci NOT NULL,
  `MyTime` longtext COLLATE utf8_unicode_ci NOT NULL,
  `logtime` longtext COLLATE utf8_unicode_ci NOT NULL,
  `logdate` longtext COLLATE utf8_unicode_ci NOT NULL,
  `sortdate` longtext COLLATE utf8_unicode_ci NOT NULL,
  `sortdate2` date NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
 
INSERT INTO `testdata` (`IDrun`, `IDrun2`, `IDnumber`, `Name`, `Work1`, `Work2`, `MyTime`, `logtime`, `logdate`, `sortdate`, `sortdate2`) VALUES
(74, 'aaaaaa', '111111', 'aaaaaa', '', '', 'Start', '07:00:00', '13-04-2563', '2563-04-13', '2020-04-13'),
(75, 'bbbbbb', '222222', 'bbbbbb', '', '', 'Start', '08:00:00', '13-04-2563', '2563-04-13', '2020-04-13'),
(76, 'bbbbbb', '222222', 'bbbbbb', '', '', 'Finish', '16:00:00', '13-04-2563', '2563-04-13', '2020-04-13'),
(77, 'aaaaaa', '111111', 'aaaaaa', '', '', 'Finish', '18:00:00', '13-04-2563', '2563-04-13', '2020-04-13'),
(78, 'cccccc', '333333', 'cccccc', '', '', 'Start', '08:00:00', '14-04-2563', '2563-04-14', '2020-04-14'),
(79, 'dddddd', '444444', 'dddddd', '', '', 'Start', '08:00:00', '14-04-2563', '2563-04-14', '2020-04-14'),
(80, 'dddddd', '444444', 'dddddd', '', '', 'Finish', '16:00:00', '14-04-2563', '2563-04-14', '2020-04-14'),
(81, 'cccccc', '333333', 'cccccc', '', '', 'Finish', '16:00:00', '14-04-2563', '2563-04-14', '2020-04-14'),
(82, 'eeeeee', '555555', 'eeeeee', '', '', 'Finish', '20:00:00', '14-04-2563', '2563-04-14', '2020-04-14'),
(83, 'eeeeee', '555555', 'eeeeee', '', '', 'Start', '07:00:00', '14-04-2563', '2563-04-14', '2020-04-14');
 
ALTER TABLE `testdata`
  ADD PRIMARY KEY (`IDrun`);
 
ALTER TABLE `testdata`
  MODIFY `IDrun` int(100) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=86;

2. newsqlformat.php

<?php
    $conn = mysqli_connect("localhost", "root", "", "testdata");
    mysqli_set_charset($conn, "utf8");
     
    $post_at = "";
    $post_at_to_date = "";
     
    $_post_at = (isset($_POST['search']['post_at'])) ? $_POST['search']['post_at'] : '';
    $_post_at_to_date = (isset($_POST['search']['post_at_to_date'])) ? $_POST['search']['post_at_to_date'] : '';
     
    $queryCondition = "";
    if(!empty($_POST["search"]["post_at"])) {           
        $post_at = $_POST["search"]["post_at"];
        list($fid,$fim,$fiy) = explode("-",$post_at);
       
        $post_at_todate = date('Y-m-d');
        if(!empty($_POST["search"]["post_at_to_date"])) {
            $post_at_to_date = $_POST["search"]["post_at_to_date"];
            list($tid,$tim,$tiy) = explode("-",$_POST["search"]["post_at_to_date"]);
            $post_at_todate = "$tiy-$tim-$tid";
        }
       
        $queryCondition .= "WHERE sortdate BETWEEN '$fiy-$fim-$fid' AND '" . $post_at_todate . "'";
    }
 
    $sql = "SELECT 
	t1.IDnumber as number,
	t1.Name as name,
	t1.Work1 as cc,
	t1.Work2 as ee,
	t1.logdate as date,
	t1.MyTime as statusin,
	t1.logtime as timein,
	t2.MyTime as statusout,
	t2.logtime as timeout
	FROM testdata AS t1
	LEFT JOIN testdata AS t2 ON t2.IDnumber = t1.IDnumber
	GROUP BY t1.IDnumber,t1.MyTime,t2.MyTime,t1.logdate 
	HAVING CONCAT(t1.MyTime,t2.MyTime) ='StartFinish' " . $queryCondition . " ORDER BY sortdate ASC, logtime ASC";
    $result = mysqli_query($conn,$sql);
?>
 
<html>
    <head>
    <meta charset="UTF-8">        
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
    <style>
    * {
        font-size: 24px;
    }
     
    .table-content{border-top:#CCCCCC 4px solid; width:80%; overflow-x:auto;}
    .table-content th {padding:5px 20px; background: #F0F0F0;vertical-align:top;} 
    .table-content td {padding:5px 20px; border-bottom: #F0F0F0 1px solid;vertical-align:top;}  
    </style>
    </head>
     
    <body><center>
    <div class="demo-content">
  <form name="frmSearch" method="POST" action="">
     <p class="search_input">
        <input type="text" placeholder="From Date" id="post_at" name="search[post_at]" value="<?php echo $post_at; ?>" class="input-control" />&nbsp;&nbsp;
        <input type="text" placeholder="To Date" id="post_at_to_date" name="search[post_at_to_date]" style="margin-left:10px"  value="<?php echo $post_at_to_date; ?>" class="input-control" /><br>    
        <input type="submit" name="go" value="Search" >&nbsp;&nbsp;&nbsp;&nbsp;
        <a href = "excel2.php?search[post_at]=<?=$_post_at?>&search[post_at_to_date]=<?=$_post_at_to_date?>&go=Search">Export to Excel</a>
    </p>
    <?php if(!empty($result)) { ?>
    <table class="table-content">
        <thead>
        <tr>
        <th><div align="center">number </div></th>
        <th style="width:22%"><div align="center">name </div></th>
        <th><div align="center">cc </div></th>
        <th><div align="center">ee </div></th>
        <th style="width:15%"><div align="center">date </div></th>
        <th><div align="center">status </div></th>
        <th><div align="center">time </div></th>
		<th><div align="center">status2 </div></th>
        <th><div align="center">time2 </div></th>
        </tr>
      </thead>
    <tbody>
    <?php
        while($row = mysqli_fetch_array($result)) {
    ?>
        <tr>
        <td><div align="center"><?php echo $row["number"];?></div></td>
        <td><div align="left"><?php echo $row["name"];?></div></td>
        <td><div align="center"><?php echo $row["cc"];?></div></td>
        <td><div align="center"><?php echo $row["ee"];?></div></td>
        <td><div align="center"><?php echo $row["date"];?></div></td>
        <td><div align="center"><?php echo $row["statusin"];?></div></td>
        <td><div align="center"><?php echo $row["timein"];?></div></td>
		<td><div align="center"><?php echo $row["statusout"];?></div></td>
        <td><div align="center"><?php echo $row["timeout"];?></div></td>
        </tr>
   <?php
        }
   ?>
   <tbody>
  </table>
<?php } ?>
  </form>
  </div>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<script>
    $.datepicker.setDefaults({
    dateFormat: 'dd-mm-yy',
    showOn: 'button',
    buttonImage: "datepicker.png",
        buttonImageOnly: false,
        dayNamesMin: ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'], 
        monthNamesShort: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน','กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
        changeMonth: true,
        changeYear: true,
        beforeShow:function(){  
            if($(this).val()!=""){
                var arrayDate=$(this).val().split("-");     
                arrayDate[2]=parseInt(arrayDate[2])-543;
                $(this).val(arrayDate[0]+"-"+arrayDate[1]+"-"+arrayDate[2]);
            }
            setTimeout(function(){
                $.each($(".ui-datepicker-year option"),function(j,k){
                    var textYear=parseInt($(".ui-datepicker-year option").eq(j).val())+543;
                    $(".ui-datepicker-year option").eq(j).text(textYear);
                });             
            },50);
        },
        onChangeMonthYear: function(){
            setTimeout(function(){
                $.each($(".ui-datepicker-year option"),function(j,k){
                    var textYear=parseInt($(".ui-datepicker-year option").eq(j).val())+543;
                    $(".ui-datepicker-year option").eq(j).text(textYear);
                });             
            },50);      
        },
        onClose:function(){
            if($(this).val()!="" && $(this).val()==dateBefore){         
                var arrayDate=dateBefore.split("-");
                arrayDate[2]=parseInt(arrayDate[2])+543;
                $(this).val(arrayDate[0]+"-"+arrayDate[1]+"-"+arrayDate[2]);    
            }       
        },
        onSelect: function(dateText, inst){ 
            dateBefore=$(this).val();
            var arrayDate=dateText.split("-");
            arrayDate[2]=parseInt(arrayDate[2])+543;
            $(this).val(arrayDate[0]+"-"+arrayDate[1]+"-"+arrayDate[2]);
        }   
    });
 
    $(function() {
    $("#post_at").datepicker();
    $("#post_at_to_date").datepicker();
    });
</script>
</center>
</body></html>

ติดปัญหา คือ ไม่แสดงตารางที่รวมข้อมูลออกมา แบบเดียวกับความคิดเห็นที่ 1 ตามรูปด้านล่างครับ
 

 
จึงสอบถามว่า ต้องแก้ไข Code อย่างไร จึงจะแสดงตารางจากการ SQL Code ตามความคิดเห็นที่ 1 ออกมาได้ครับ


Sumate Mephokkij 159.192.218.xxx 19-04-2020 14:33
 ความคิดเห็นที่ 3
แนะนำในเรื่องการจัดเก็บข้อมูลวันที่ ในฐานข้อมูล ในดูลิ้งค์เนื้อหาด้านล่างประกอบ
ข้อมูลวันที่ เราจำเป้นจะต้องเก็บในรูปแบบ date datetime หรือ timestamp แล้ว
แต่กรณี แต่ส่วนใหญ่จะนิยมใช้ date และ datetime ในรูปแบบมาตรฐาน คือ
0000-00-00 และ 0000-00-00 00:00:00 โดยจัดเก็บในรูปปี ที่เป็น ค.ศ.
    เหตุผลที่เราจำเป็นต้องกำหนดตามรูปแบบมาตรฐาน เพราะจะสามารถจัดการเกี่ยว
กับวันที่ได้อย่างถูกต้อง เช่น การค้นหาข่วงข้อมูลวันที่ การเพิ่ม การลด การจัดการรูป
แบบวันที่ต่างๆ จะทำได้ถูกต้องมากขึ้น
    ดังนั้น ในการหาช่วงของวันที่ เราต้องใช้ฟิลด์ ทีเป็น date นั่นคือจากตัวอย่าง ต้องเป็น
sortdate2 ที่มีรูปแบบ 0000-00-00
    โดยการส่งค่าตัวแปรในเงื่อนไข เราต้องใช้เป็นรูปแบบเดียวกับ คือเป็นปี ค.ศ. 
ตัวอย่างเช่น 
 
WHERE sortdate2 BETWEEN '2020-04-13' AND '2020-04-14'
// ไม่ใช้รูปแบบ WHERE sortdate2 BETWEEN '2563-04-13' AND '2563-04-14'
 
    ฉะนั้น กรณีเราส่งวันที่แบบปี พ.ศ. ให้เราทำการแปลงวันที่เป้น ค.ศ.ก่อน นำไปใช้งาน
โดยใช้จำนวนปี ลบ 543 ดูแนวทางในลิ้งค์ด้านล่าง
 
    ต่อไปกลับมาที่คำถาม เวลาใช้งาน จากคำสั่ง sql ตัวอย่าง เราใช้วิธีการกำหนดชื่อเรียก
เพื่ออ้างอิงชื่อตารางให้กระชับ โดยกำหนดเป้น testdata AS t1 หรือจะใช้เป็น testdata t1
ก็ได้เหมือนกัน นั่นคือ เราให้ตาราง testdata ให้สามารถเรียกผ่านชื่อ t1 ได้ และว่าเราจะอ้าง
อิงฟิลด์ในตาราง เราต้องมีชื่อเรียกก่อนเสมอ เช่น IDnumber ก็จะเป็น t1.IDnumber นั่นคือ
ฟิลด์ IDnumber ของตารางที่ใช้ชื่อเรียกเป็น t1 เป็นต้น เวลาใช้เงื่อนไข แบบเต็มก็ได้เป็น
 
SELECT
t1.IDnumber as number,
t1.Name as name,
t1.Work1 as cc,
t1.Work2 as ee,
t1.logdate as date,
t1.MyTime as statusin,
t1.logtime as timein,
t2.MyTime as statusout,
t2.logtime as timeout
FROM testdata AS t1
LEFT JOIN testdata AS t2 ON t2.IDnumber = t1.IDnumber
WHERE t1.sortdate2 BETWEEN '2020-04-13' AND '2020-04-14' 
GROUP BY t1.IDnumber,t1.MyTime,t2.MyTime,t1.logdate 
HAVING CONCAT(t1.MyTime,t2.MyTime) ='StartFinish'
 
สังเกตว่า เราจะใช้เป็น t1.sortdate2 แทนที่จะเป็น sortdate2 เฉยๆ โดยคำสั่ง WHERE
เราจะวางก่อนการจัดกลุ่มด้วย GROUP BY 
    เข้าใจอย่างง่าย WHERE จัดการเงื่อนไขข้อมูลก่อนจัดกลุ่มด้วย GROUP BY
ส่วน HAVING จัดการเงื่อนไขของกลุ่มข้อมูล หรือข้อมูลที่จัดกลุ่มด้วย GROUP BY แล้ว
 
ลองดูการใส่เงื่อนไข แต่ละส่วน และผลลัพธ์ตามลำดับดังนี้ดู

SELECT
t1.IDnumber as number,
t1.Name as name,
t1.Work1 as cc,
t1.Work2 as ee,
t1.logdate as date,
t1.MyTime as statusin,
t1.logtime as timein,
t2.MyTime as statusout,
t2.logtime as timeout
FROM testdata AS t1
LEFT JOIN testdata AS t2 ON t2.IDnumber = t1.IDnumber
 
SELECT
t1.IDnumber as number,
t1.Name as name,
t1.Work1 as cc,
t1.Work2 as ee,
t1.logdate as date,
t1.MyTime as statusin,
t1.logtime as timein,
t2.MyTime as statusout,
t2.logtime as timeout
FROM testdata AS t1
LEFT JOIN testdata AS t2 ON t2.IDnumber = t1.IDnumber
WHERE t1.sortdate2 BETWEEN '2020-04-13' AND '2020-04-14' 
 
สองคำสั่งนี้ได้ข้อมุลเหมือนกัน เพราะข้อมูลเรามีแค่วันที่ 13 และ 14


 


>>>  อัพเดท >>> 19-04-2020
------------------------------------------
สมมติเราเลือกเฉพาะวันที่ 13 จะได้เป็น
 
SELECT
t1.IDnumber as number,
t1.Name as name,
t1.Work1 as cc,
t1.Work2 as ee,
t1.logdate as date,
t1.MyTime as statusin,
t1.logtime as timein,
t2.MyTime as statusout,
t2.logtime as timeout
FROM testdata AS t1
LEFT JOIN testdata AS t2 ON t2.IDnumber = t1.IDnumber
WHERE t1.sortdate2 = '2020-04-13' 
 
 
ข้างต้นคือเงื่อนไข ก่อนจัดกลุ่มข้อมูล 
 
ต่อไป เราลองจัดกลุ่มข้อมูล โดยใช้แค่ฟิลด์เดียว
 
SELECT
t1.IDnumber as number,
t1.Name as name,
t1.Work1 as cc,
t1.Work2 as ee,
t1.logdate as date,
t1.MyTime as statusin,
t1.logtime as timein,
t2.MyTime as statusout,
t2.logtime as timeout
FROM testdata AS t1
LEFT JOIN testdata AS t2 ON t2.IDnumber = t1.IDnumber
WHERE t1.sortdate2 BETWEEN '2020-04-13' AND '2020-04-14' 
GROUP BY t1.IDnumber
 
การจัดกลุ่มโดยกำหนดแค่ฟิลด์เดียว ก็เหมือนกับเราต้องการแสดงข้อมูลที่เป็น DISTINCT
ของฟิลด์นั้นๆ นั่นคือเราจะได้ IDnumber ที่ไม่ซ้ำกันดังรูป
 
 
จะเห็นว่ายังไม่ใช่ข้อมูลที่เราต้องการ ดังนั้น เราต้องจัดกลุ่มข้อมูล โดยกำหนดฟิลด์เพิ่ม โดยจำนวน
ฟิลด์ที่เพิ่มขึ้น ก็เหมือนกับการเพิ่ม AND ให้กับข้อมูลนั้น เช่น สมมติจำนวนฟิลด์ และค่าข้อมูล
 
GROUP BY t1.IDnumber 
กลุ่มข้อมูลจะเป็น "111111"

GROUP BY t1.IDnumber,t1.MyTime
กลุ่มข้อมูลจะเป็น "111111Start"

GROUP BY t1.IDnumber,t1.MyTime,t2.MyTime
กลุ่มข้อมูลจะเป็น "111111StartStart"

GROUP BY t1.IDnumber,t1.MyTime,t2.MyTime,t1.logdate
กลุ่มข้อมูลจะเป็น "111111StartStart13-04-2563"
 
สังเกตผลลัพธฺ์ 2 เงื่อนไขนี้ โดยเราลองสมมติการจัดกลุ่มเข้าใปชื่อว่า groups
 
SELECT
CONCAT(t1.IDnumber,t1.MyTime,t2.MyTime,t1.logdate) as groups,
t1.IDnumber as number,
t1.Name as name,
t1.Work1 as cc,
t1.Work2 as ee,
t1.logdate as date,
t1.MyTime as statusin,
t1.logtime as timein,
t2.MyTime as statusout,
t2.logtime as timeout
FROM testdata AS t1
LEFT JOIN testdata AS t2 ON t2.IDnumber = t1.IDnumber
WHERE t1.sortdate2 BETWEEN '2020-04-13' AND '2020-04-14'
 
 
และแบบจัดกลุ่ม โดยใช้ GROUP BY
 
SELECT
CONCAT(t1.IDnumber,t1.MyTime,t2.MyTime,t1.logdate) as groups,
t1.IDnumber as number,
t1.Name as name,
t1.Work1 as cc,
t1.Work2 as ee,
t1.logdate as date,
t1.MyTime as statusin,
t1.logtime as timein,
t2.MyTime as statusout,
t2.logtime as timeout
FROM testdata AS t1
LEFT JOIN testdata AS t2 ON t2.IDnumber = t1.IDnumber
WHERE t1.sortdate2 BETWEEN '2020-04-13' AND '2020-04-14'
GROUP BY t1.IDnumber,t1.MyTime,t2.MyTime,t1.logdate 

 
ให้ลองดูเฉพาะชื่อ aaaaa เราจะเห็นว่าในกลุ่มข้อมูล มีชุดข้อมูลที่ถูกต้องอยู่
นั่นคือมีวันที่เป็น มี statusin เป็น Start และ statusout เป็น Finish มีเวลา in และ out
ที่ถูกต้อง ในแถวที่ 3  ดังนั้น เราจะทำการใส่เงื่อนไข ให้กับข้อมูลที่จัดกลุ่มแล้ว โดยใช้ HAVING
โดยใช้คำสั่ง CONCAT() เพื่อเชื่อมสองฟิลด์เป็นข้อความเดียว แล้วใช้เป็นเงื่อนไข
ในที่นี้ เราต้องการข้อมูลที่มีทั้ง Start และ Finish หรือข้อมูลที่มีค่า
 
CONCAT(t1.MyTime,t2.MyTime) ='StartFinish' 
ก็ได้เป้น
 
SELECT
CONCAT(t1.IDnumber,t1.MyTime,t2.MyTime,t1.logdate) as groups,
t1.IDnumber as number,
t1.Name as name,
t1.Work1 as cc,
t1.Work2 as ee,
t1.logdate as date,
t1.MyTime as statusin,
t1.logtime as timein,
t2.MyTime as statusout,
t2.logtime as timeout
FROM testdata AS t1
LEFT JOIN testdata AS t2 ON t2.IDnumber = t1.IDnumber
WHERE t1.sortdate2 BETWEEN '2020-04-13' AND '2020-04-14' 
GROUP BY t1.IDnumber,t1.MyTime,t2.MyTime,t1.logdate 
HAVING CONCAT(t1.MyTime,t2.MyTime) ='StartFinish'
 
จะเหลือเฉพาะข้อมูลที่เราต้องการ
 
ปรับคำสั่ง และการกำหนดการคิวรี่เป็น
 
    $queryCondition = "";
    if(!empty($_POST["search"]["post_at"])) {           
        $post_at = $_POST["search"]["post_at"];
        list($fid,$fim,$fiy) = explode("-",$post_at);
        
        $post_at_todate = date('Y-m-d');
        if(!empty($_POST["search"]["post_at_to_date"])) {
            $post_at_to_date = $_POST["search"]["post_at_to_date"];
            list($tid,$tim,$tiy) = explode("-",$_POST["search"]["post_at_to_date"]);
            $post_at_todate = "$tiy-$tim-$tid";
        }
        
        $queryCondition .= "WHERE t1.sortdate2 BETWEEN '$fiy-$fim-$fid' AND '" . $post_at_todate . "'";
    }
  
    $sql = "SELECT 
    t1.IDnumber as number,
    t1.Name as name,
    t1.Work1 as cc,
    t1.Work2 as ee,
    t1.logdate as date,
    t1.MyTime as statusin,
    t1.logtime as timein,
    t2.MyTime as statusout,
    t2.logtime as timeout
    FROM testdata AS t1
    LEFT JOIN testdata AS t2 ON t2.IDnumber = t1.IDnumber
    " . $queryCondition . " 
    GROUP BY t1.IDnumber,t1.MyTime,t2.MyTime,t1.logdate 
    HAVING CONCAT(t1.MyTime,t2.MyTime) ='StartFinish'  ORDER BY t1.sortdate ASC, t1.logtime ASC";
 
    ถ้าปีที่ส่งมาเป็น พ.ศ. ก็ให้เปลี่ยนเป็น ค.ศ. โดยลบ 543 จะได้เป็น
 
    $queryCondition = "";
    if(!empty($_POST["search"]["post_at"])) {           
        $post_at = $_POST["search"]["post_at"];
        list($fid,$fim,$fiy) = explode("-",$post_at);
		$fiy = $fiy-543;
        
        $post_at_todate = date('Y-m-d');
        if(!empty($_POST["search"]["post_at_to_date"])) {
            $post_at_to_date = $_POST["search"]["post_at_to_date"];
            list($tid,$tim,$tiy) = explode("-",$_POST["search"]["post_at_to_date"]);
			$tiy = $tiy-543;
            $post_at_todate = "$tiy-$tim-$tid";
        }
        
        $queryCondition .= "WHERE t1.sortdate2 BETWEEN '$fiy-$fim-$fid' AND '" . $post_at_todate . "'";
    }


บทความแนะนำที่เกี่ยวข้อง
ตัวอย่าง การใช้งาน วันที่ ใน mysql และคำสั่ง เทคนิค การ queryอ่าน 38,881
แนวทางการจัดรูปแบบข้อความวันที่ ให้อยู่ในรูปแบบมาตรฐาน ใน phpอ่าน 3,782
Ninenik 223.24.185.xxx 19-04-2020
 ความคิดเห็นที่ 4
ขอบคุณครับ สำหรับคำตอบ Code ใช้งานได้แล้ว ซึ่งปรับปรุงเป็นฉบับของตัวเอง ซึ่งสลับได้ทั้งแบบปกติและแบบ รวมตาราง status = start กับ finish ได้ รวมถึง Export เป็น Excel ในรูปแบบ รวมตาราง status = start กับ finish ได้แล้ว ดังนี้ครับ

เพิ้มเติม : บรรทัดตรง header $strExcelFileName ไม่มี Backslash ให้พิมพ์ตามรูปด้านล่างครับ

 
1. testdata.sql (ชื่อ database คือ testdata ครับ)

CREATE TABLE `testdata` (
  `IDrun` int(100) NOT NULL,
  `IDrun2` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `IDnumber` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `Name` longtext COLLATE utf8_unicode_ci NOT NULL,
  `Work1` longtext COLLATE utf8_unicode_ci NOT NULL,
  `Work2` longtext COLLATE utf8_unicode_ci NOT NULL,
  `MyTime` longtext COLLATE utf8_unicode_ci NOT NULL,
  `logtime` longtext COLLATE utf8_unicode_ci NOT NULL,
  `logdate` longtext COLLATE utf8_unicode_ci NOT NULL,
  `sortdate` longtext COLLATE utf8_unicode_ci NOT NULL,
  `sortdate2` date NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
 
INSERT INTO `testdata` (`IDrun`, `IDrun2`, `IDnumber`, `Name`, `Work1`, `Work2`, `MyTime`, `logtime`, `logdate`, `sortdate`, `sortdate2`) VALUES
(74, 'aaaaaa', '111111', 'aaaaaa', '', '', 'Start', '07:00:00', '13-04-2563', '2563-04-13', '2020-04-13'),
(75, 'bbbbbb', '222222', 'bbbbbb', '', '', 'Start', '08:00:00', '13-04-2563', '2563-04-13', '2020-04-13'),
(76, 'bbbbbb', '222222', 'bbbbbb', '', '', 'Finish', '16:00:00', '13-04-2563', '2563-04-13', '2020-04-13'),
(77, 'aaaaaa', '111111', 'aaaaaa', '', '', 'Finish', '18:00:00', '13-04-2563', '2563-04-13', '2020-04-13'),
(78, 'cccccc', '333333', 'cccccc', '', '', 'Start', '08:00:00', '14-04-2563', '2563-04-14', '2020-04-14'),
(79, 'dddddd', '444444', 'dddddd', '', '', 'Start', '08:00:00', '14-04-2563', '2563-04-14', '2020-04-14'),
(80, 'dddddd', '444444', 'dddddd', '', '', 'Finish', '16:00:00', '14-04-2563', '2563-04-14', '2020-04-14'),
(81, 'cccccc', '333333', 'cccccc', '', '', 'Finish', '16:00:00', '14-04-2563', '2563-04-14', '2020-04-14'),
(82, 'eeeeee', '555555', 'eeeeee', '', '', 'Finish', '20:00:00', '14-04-2563', '2563-04-14', '2020-04-14'),
(83, 'eeeeee', '555555', 'eeeeee', '', '', 'Start', '07:00:00', '14-04-2563', '2563-04-14', '2020-04-14');
 
ALTER TABLE `testdata`
  ADD PRIMARY KEY (`IDrun`);
 
ALTER TABLE `testdata`
  MODIFY `IDrun` int(100) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=86;

2. index.php

<?php
    $conn = mysqli_connect("localhost", "root", "", "testdata");
    mysqli_set_charset($conn, "utf8");
     
    $post_at = "";
    $post_at_to_date = "";
     
    $_post_at = (isset($_POST['search']['post_at'])) ? $_POST['search']['post_at'] : '';
    $_post_at_to_date = (isset($_POST['search']['post_at_to_date'])) ? $_POST['search']['post_at_to_date'] : '';
     
    $queryCondition = "";
    if(!empty($_POST["search"]["post_at"])) {           
        $post_at = $_POST["search"]["post_at"];
        list($fid,$fim,$fiy) = explode("-",$post_at);
       
        $post_at_todate = date('Y-m-d');
        if(!empty($_POST["search"]["post_at_to_date"])) {
            $post_at_to_date = $_POST["search"]["post_at_to_date"];
            list($tid,$tim,$tiy) = explode("-",$_POST["search"]["post_at_to_date"]);
            $post_at_todate = "$tiy-$tim-$tid";
        }
       
        $queryCondition .= "WHERE sortdate BETWEEN '$fiy-$fim-$fid' AND '" . $post_at_todate . "'";
    }
 
    $sql =  "SELECT * FROM testdata " . $queryCondition . " ORDER BY sortdate ASC, logtime ASC";
    $result = mysqli_query($conn,$sql);
?>
 
<html>
    <head>
    <meta charset="UTF-8">        
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
    <style>
    * {
        font-size: 24px;
    }
     
    .table-content{border-top:#CCCCCC 4px solid; width:80%; overflow-x:auto;}
    .table-content th {padding:5px 20px; background: #F0F0F0;vertical-align:top;} 
    .table-content td {padding:5px 20px; border-bottom: #F0F0F0 1px solid;vertical-align:top;}  
    </style>
    </head>
     
    <body><center>
    <div class="demo-content">
  <form name="frmSearch" method="POST" action="">
     <p class="search_input">
        <input type="text" placeholder="From Date" id="post_at" name="search[post_at]" value="<?php echo $post_at; ?>" class="input-control" />&nbsp;&nbsp;
        <input type="text" placeholder="To Date" id="post_at_to_date" name="search[post_at_to_date]" style="margin-left:10px"  value="<?php echo $post_at_to_date; ?>" class="input-control" /><br>    
        <input type="submit" name="go" value="Search" >&nbsp;&nbsp;&nbsp;&nbsp;
		<a href = "newsqlformat.php">Change to Join Mode</a>&nbsp;&nbsp;&nbsp;&nbsp;
        <a href = "excel2.php?search[post_at]=<?=$_post_at?>&search[post_at_to_date]=<?=$_post_at_to_date?>&go=Search">Export to Excel</a>
    </p>
    <?php if(!empty($result)) { ?>
    <table class="table-content">
        <thead>
        <tr>
        <th><div align="center">number </div></th>
        <th style="width:22%"><div align="center">name </div></th>
        <th><div align="center">cc </div></th>
        <th><div align="center">ee </div></th>
        <th style="width:15%"><div align="center">date </div></th>
        <th><div align="center">status </div></th>
        <th><div align="center">time </div></th>
        </tr>
      </thead>
    <tbody>
    <?php
        while($row = mysqli_fetch_array($result)) {
    ?>
        <tr>
        <td><div align="center"><?php echo $row["IDnumber"];?></div></td>
        <td><div align="left"><?php echo $row["Name"];?></div></td>
        <td><div align="center"><?php echo $row["Work1"];?></div></td>
        <td><div align="center"><?php echo $row["Work2"];?></div></td>
        <td><div align="center"><?php echo $row["logdate"];?></div></td>
        <td><div align="center"><?php echo $row["MyTime"];?></div></td>
        <td><div align="center"><?php echo $row["logtime"];?></div></td>
        </tr>
   <?php
        }
   ?>
   <tbody>
  </table>
<?php } ?>
  </form>
  </div>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<script>
    $.datepicker.setDefaults({
    dateFormat: 'dd-mm-yy',
    showOn: 'button',
    buttonImage: "datepicker.png",
        buttonImageOnly: false,
        dayNamesMin: ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'], 
        monthNamesShort: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน','กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
        changeMonth: true,
        changeYear: true,
        beforeShow:function(){  
            if($(this).val()!=""){
                var arrayDate=$(this).val().split("-");     
                arrayDate[2]=parseInt(arrayDate[2])-543;
                $(this).val(arrayDate[0]+"-"+arrayDate[1]+"-"+arrayDate[2]);
            }
            setTimeout(function(){
                $.each($(".ui-datepicker-year option"),function(j,k){
                    var textYear=parseInt($(".ui-datepicker-year option").eq(j).val())+543;
                    $(".ui-datepicker-year option").eq(j).text(textYear);
                });             
            },50);
        },
        onChangeMonthYear: function(){
            setTimeout(function(){
                $.each($(".ui-datepicker-year option"),function(j,k){
                    var textYear=parseInt($(".ui-datepicker-year option").eq(j).val())+543;
                    $(".ui-datepicker-year option").eq(j).text(textYear);
                });             
            },50);      
        },
        onClose:function(){
            if($(this).val()!="" && $(this).val()==dateBefore){         
                var arrayDate=dateBefore.split("-");
                arrayDate[2]=parseInt(arrayDate[2])+543;
                $(this).val(arrayDate[0]+"-"+arrayDate[1]+"-"+arrayDate[2]);    
            }       
        },
        onSelect: function(dateText, inst){ 
            dateBefore=$(this).val();
            var arrayDate=dateText.split("-");
            arrayDate[2]=parseInt(arrayDate[2])+543;
            $(this).val(arrayDate[0]+"-"+arrayDate[1]+"-"+arrayDate[2]);
        }   
    });
 
    $(function() {
    $("#post_at").datepicker();
    $("#post_at_to_date").datepicker();
    });
</script>
</center>
</body></html>

3. newsqlformat.php

<?php
    $conn = mysqli_connect("localhost", "root", "", "testdata");
    mysqli_set_charset($conn, "utf8");
     
    $post_at = "";
    $post_at_to_date = "";
     
    $_post_at = (isset($_POST['search']['post_at'])) ? $_POST['search']['post_at'] : '';
    $_post_at_to_date = (isset($_POST['search']['post_at_to_date'])) ? $_POST['search']['post_at_to_date'] : '';
     
	$queryCondition = "";
	if(!empty($_POST["search"]["post_at"])) {           
		$post_at = $_POST["search"]["post_at"];
		list($fid,$fim,$fiy) = explode("-",$post_at);
		$fiy = $fiy-543;
     
		$post_at_todate = date('Y-m-d');
		if(!empty($_POST["search"]["post_at_to_date"])) {
			$post_at_to_date = $_POST["search"]["post_at_to_date"];
			list($tid,$tim,$tiy) = explode("-",$_POST["search"]["post_at_to_date"]);
			$tiy = $tiy-543;
			$post_at_todate = "$tiy-$tim-$tid";
		}
		
		$queryCondition .= "WHERE t1.sortdate2 BETWEEN '$fiy-$fim-$fid' AND '" . $post_at_todate . "'";
	}
 
	$sql = "SELECT 
	t1.IDnumber as number,
	t1.Name as name,
	t1.Work1 as cc,
	t1.Work2 as ee,
	t1.logdate as date,
	t1.MyTime as statusin,
	t1.logtime as timein,
	t2.MyTime as statusout,
	t2.logtime as timeout
	FROM testdata AS t1
	LEFT JOIN testdata AS t2 ON t2.IDnumber = t1.IDnumber
	" . $queryCondition . "
	GROUP BY t1.IDnumber,t1.MyTime,t2.MyTime,t1.logdate 
	HAVING CONCAT(t1.MyTime,t2.MyTime) ='StartFinish'  ORDER BY t1.sortdate ASC, t1.logtime ASC";

    $result = mysqli_query($conn,$sql);
?>
 
<html>
    <head>
    <meta charset="UTF-8">        
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
    <style>
    * {
        font-size: 24px;
    }
     
    .table-content{border-top:#CCCCCC 4px solid; width:80%; overflow-x:auto;}
    .table-content th {padding:5px 20px; background: #F0F0F0;vertical-align:top;} 
    .table-content td {padding:5px 20px; border-bottom: #F0F0F0 1px solid;vertical-align:top;}  
    </style>
    </head>
     
    <body><center>
    <div class="demo-content">
  <form name="frmSearch" method="POST" action="">
     <p class="search_input">
        <input type="text" placeholder="From Date" id="post_at" name="search[post_at]" value="<?php echo $post_at; ?>" class="input-control" />&nbsp;&nbsp;
        <input type="text" placeholder="To Date" id="post_at_to_date" name="search[post_at_to_date]" style="margin-left:10px"  value="<?php echo $post_at_to_date; ?>" class="input-control" /><br>    
        <input type="submit" name="go" value="Search" >&nbsp;&nbsp;&nbsp;&nbsp;
		<a href = "index.php">Change to Normal Mode</a>&nbsp;&nbsp;&nbsp;&nbsp;
        <a href = "excel2.php?search[post_at]=<?=$_post_at?>&search[post_at_to_date]=<?=$_post_at_to_date?>&go=Search">Export to Excel</a>
    </p>
    <?php if(!empty($result)) { ?>
    <table class="table-content">
        <thead>
        <tr>
        <th><div align="center">number </div></th>
        <th style="width:22%"><div align="center">name </div></th>
        <th><div align="center">cc </div></th>
        <th><div align="center">ee </div></th>
        <th style="width:15%"><div align="center">date </div></th>
        <th><div align="center">status </div></th>
        <th><div align="center">time </div></th>
		<th><div align="center">status2 </div></th>
        <th><div align="center">time2 </div></th>
        </tr>
      </thead>
    <tbody>
    <?php
        while($row = mysqli_fetch_array($result)) {
    ?>
        <tr>
        <td><div align="center"><?php echo $row["number"];?></div></td>
        <td><div align="left"><?php echo $row["name"];?></div></td>
        <td><div align="center"><?php echo $row["cc"];?></div></td>
        <td><div align="center"><?php echo $row["ee"];?></div></td>
        <td><div align="center"><?php echo $row["date"];?></div></td>
        <td><div align="center"><?php echo $row["statusin"];?></div></td>
        <td><div align="center"><?php echo $row["timein"];?></div></td>
		<td><div align="center"><?php echo $row["statusout"];?></div></td>
        <td><div align="center"><?php echo $row["timeout"];?></div></td>
        </tr>
   <?php
        }
   ?>
   <tbody>
  </table>
<?php } ?>
  </form>
  </div>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<script>
    $.datepicker.setDefaults({
    dateFormat: 'dd-mm-yy',
    showOn: 'button',
    buttonImage: "datepicker.png",
        buttonImageOnly: false,
        dayNamesMin: ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'], 
        monthNamesShort: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน','กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
        changeMonth: true,
        changeYear: true,
        beforeShow:function(){  
            if($(this).val()!=""){
                var arrayDate=$(this).val().split("-");     
                arrayDate[2]=parseInt(arrayDate[2])-543;
                $(this).val(arrayDate[0]+"-"+arrayDate[1]+"-"+arrayDate[2]);
            }
            setTimeout(function(){
                $.each($(".ui-datepicker-year option"),function(j,k){
                    var textYear=parseInt($(".ui-datepicker-year option").eq(j).val())+543;
                    $(".ui-datepicker-year option").eq(j).text(textYear);
                });             
            },50);
        },
        onChangeMonthYear: function(){
            setTimeout(function(){
                $.each($(".ui-datepicker-year option"),function(j,k){
                    var textYear=parseInt($(".ui-datepicker-year option").eq(j).val())+543;
                    $(".ui-datepicker-year option").eq(j).text(textYear);
                });             
            },50);      
        },
        onClose:function(){
            if($(this).val()!="" && $(this).val()==dateBefore){         
                var arrayDate=dateBefore.split("-");
                arrayDate[2]=parseInt(arrayDate[2])+543;
                $(this).val(arrayDate[0]+"-"+arrayDate[1]+"-"+arrayDate[2]);    
            }       
        },
        onSelect: function(dateText, inst){ 
            dateBefore=$(this).val();
            var arrayDate=dateText.split("-");
            arrayDate[2]=parseInt(arrayDate[2])+543;
            $(this).val(arrayDate[0]+"-"+arrayDate[1]+"-"+arrayDate[2]);
        }   
    });
 
    $(function() {
    $("#post_at").datepicker();
    $("#post_at_to_date").datepicker();
    });
</script>
</center>
</body></html>

4. excel2.php

<?php
    //คำสั่ง connect db เขียนเพิ่มเองนะ
 
    $serverName = "localhost";
    $userName = "root";
    $userPassword = "";
    $dbName = "testdata";
 
    $conn = mysqli_connect($serverName,$userName,$userPassword,$dbName);
    mysqli_set_charset($conn,"utf8");
 
    $strExcelFileName="testdata.xls";
 
	header("Content-Type: application/x-msexcel; name="$strExcelFileName"");
	header("Content-Disposition: inline; filename="$strExcelFileName"");
	header("Pragma:no-cache");
     
    $post_at = "";
    $post_at_to_date = "";
      
    $queryCondition = "";
    if(!empty($_GET["search"]["post_at"])) {           
        $post_at = $_GET["search"]["post_at"];
        list($fid,$fim,$fiy) = explode("-",$post_at);
		$fiy = $fiy-543;
       
        $post_at_todate = date('Y-m-d');
        if(!empty($_GET["search"]["post_at_to_date"])) {
            $post_at_to_date = $_GET["search"]["post_at_to_date"];
            list($tid,$tim,$tiy) = explode("-",$_GET["search"]["post_at_to_date"]);
			$tiy = $tiy-543;
            $post_at_todate = "$tiy-$tim-$tid";
        }
       
        $queryCondition .= "WHERE t1.sortdate2 BETWEEN '$fiy-$fim-$fid' AND '" . $post_at_todate . "'";
    }
 
    $sql = "SELECT 
	t1.IDnumber as number,
	t1.Name as name,
	t1.Work1 as cc,
	t1.Work2 as ee,
	t1.logdate as date,
	t1.MyTime as statusin,
	t1.logtime as timein,
	t2.MyTime as statusout,
	t2.logtime as timeout
	FROM testdata AS t1
	LEFT JOIN testdata AS t2 ON t2.IDnumber = t1.IDnumber
	" . $queryCondition . "
	GROUP BY t1.IDnumber,t1.MyTime,t2.MyTime,t1.logdate 
	HAVING CONCAT(t1.MyTime,t2.MyTime) ='StartFinish'  ORDER BY t1.sortdate ASC, t1.logtime ASC";
 
    $query = mysqli_query($conn,$sql);
?>
 
<html xmlns:o="urn:schemas-microsoft-com:office:office"xmlns:x="urn:schemas-microsoft-com:office:excel"xmlns="http://www.w3.org/TR/REC-html40">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
 
<body>
<strong>testdata</strong><br>
<br>
 
<div id="SiXhEaD_Excel" align=center x:publishsource="Excel">
<table x:str border=1 cellpadding=0 cellspacing=1 width=50% style="border-collapse:collapse">
<tr>
    <th><div align="center">number </div></th>
    <th><div align="center">name </div></th>
    <th><div align="center">cc </div></th>
    <th><div align="center">ee </div></th>
    <th><div align="center">date </div></th>
    <th><div align="center">status </div></th>
    <th><div align="center">time </div></th>
	<th><div align="center">status2 </div></th>
    <th><div align="center">time2 </div></th>
</tr>
 
<?php
while($result=mysqli_fetch_array($query,MYSQLI_ASSOC))
{
?>
 
<tr>
    <td><div align="center"><?php echo $result["number"];?></div></td>
    <td><div align="left"><?php echo $result["name"];?></div></td>
    <td><div align="center"><?php echo $result["cc"];?></div></td>
    <td><div align="center"><?php echo $result["ee"];?></div></td>
    <td><div align="center"><?php echo $result["date"];?></div></td>
    <td><div align="center"><?php echo $result["statusin"];?></div></td>
    <td><div align="center"><?php echo $result["timein"];?></div></td>
	<td><div align="center"><?php echo $result["statusout"];?></div></td>
    <td><div align="center"><?php echo $result["timeout"];?></div></td>
</tr>
 
<?php
}
?>
 
</table>
</div>
 
<script>
window.onbeforeunload = function(){return false;};
setTimeout(function(){window.close();}, 10000);
</script>
</body>
</html>

5. datepicker.png โหลดได้ที่ Link ด้านล่างครับ
โครงสร้าง File ทั้งหมด มีดังนี้ครับ



Screenshot 1 ที่อธิบายว่า เลือกช่วงวันที่แล้ว ก่อนที่จะ Export เป็น Excel ครับ



Screenshot 2 ที่อธิบายว่า เมื่อ Export เป็น Excel แล้ว สามารถรวมตาราง status = start กับ status = finish ใน name เดียวกันได้แล้วครับ




Sumate Mephokkij 159.192.216.xxx 20-04-2020 20:46
1






เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ