ต้องแก้ไข 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 เดียวกัน ได้ครับ
2. index.php
3. excel2.php

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

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

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

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

1. testdata.sql (ชื่อ database คือ testdata ครับ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | <?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" > <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" /> <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" > <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> $.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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | <?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 " " . $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 เดียวกันได้ ตามกรอบสีแดงครับ


คำแนะนำ และการใช้งาน
สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก
- ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
ความคิดเห็นที่
1
ดูการคิวรี่นี้เป็นแนวทาง
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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' |

ความคิดเห็นที่
2
สอบถามกับคุณ Ninenik เพิ่มเติมว่า ได้ลองเขียน SQL Code ในความคิดเห็นที่ 1 ผ่าน phpmyadmin แล้วใช้ได้ ต่อมาได้นำ SQL Code มาประยุกต์เขียนแบบ php ตาม Code ด้านล่าง
1. testdata.sql (ชื่อ database คือ testdata ครับ)
2. newsqlformat.php

1. testdata.sql (ชื่อ database คือ testdata ครับ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | <?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" > <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" /> <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" > <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> $.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 ออกมาได้ครับ

ความคิดเห็นที่
3
แนะนำในเรื่องการจัดเก็บข้อมูลวันที่ ในฐานข้อมูล ในดูลิ้งค์เนื้อหาด้านล่างประกอบ
ข้อมูลวันที่ เราจำเป้นจะต้องเก็บในรูปแบบ date datetime หรือ timestamp แล้ว
แต่กรณี แต่ส่วนใหญ่จะนิยมใช้ date และ datetime ในรูปแบบมาตรฐาน คือ
0000-00-00 และ 0000-00-00 00:00:00 โดยจัดเก็บในรูปปี ที่เป็น ค.ศ.
เหตุผลที่เราจำเป็นต้องกำหนดตามรูปแบบมาตรฐาน เพราะจะสามารถจัดการเกี่ยว
กับวันที่ได้อย่างถูกต้อง เช่น การค้นหาข่วงข้อมูลวันที่ การเพิ่ม การลด การจัดการรูป
แบบวันที่ต่างๆ จะทำได้ถูกต้องมากขึ้น
ดังนั้น ในการหาช่วงของวันที่ เราต้องใช้ฟิลด์ ทีเป็น date นั่นคือจากตัวอย่าง ต้องเป็น
sortdate2 ที่มีรูปแบบ 0000-00-00
โดยการส่งค่าตัวแปรในเงื่อนไข เราต้องใช้เป็นรูปแบบเดียวกับ คือเป็นปี ค.ศ.
ตัวอย่างเช่น
1 2 | 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 เป็นต้น เวลาใช้เงื่อนไข แบบเต็มก็ได้เป็น
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 แล้ว
ลองดูการใส่เงื่อนไข แต่ละส่วน และผลลัพธ์ตามลำดับดังนี้ดู
1 2 3 4 5 6 7 8 9 10 11 12 | 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 |
1 2 3 4 5 6 7 8 9 10 11 12 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' |
สองคำสั่งนี้ได้ข้อมุลเหมือนกัน เพราะข้อมูลเรามีแค่วันที่ 13 และ 14
![]()
>>> อัพเดท >>> 19-04-2020
------------------------------------------
สมมติเราเลือกเฉพาะวันที่ 13 จะได้เป็น
1 2 3 4 5 6 7 8 9 10 11 12 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' |
ข้างต้นคือเงื่อนไข ก่อนจัดกลุ่มข้อมูล
ต่อไป เราลองจัดกลุ่มข้อมูล โดยใช้แค่ฟิลด์เดียว
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 ให้กับข้อมูลนั้น เช่น สมมติจำนวนฟิลด์ และค่าข้อมูล
1 2 3 4 5 6 7 8 9 10 11 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 หรือข้อมูลที่มีค่า
1 | CONCAT(t1.MyTime,t2.MyTime) = 'StartFinish' |
ก็ได้เป้น
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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' |
จะเหลือเฉพาะข้อมูลที่เราต้องการ
ปรับคำสั่ง และการกำหนดการคิวรี่เป็น
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | $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 จะได้เป็น
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $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 | อ่าน 57,429 |
แนวทางการจัดรูปแบบข้อความวันที่ ให้อยู่ในรูปแบบมาตรฐาน ใน php | อ่าน 8,465 |

ความคิดเห็นที่
4
ขอบคุณครับ สำหรับคำตอบ Code ใช้งานได้แล้ว ซึ่งปรับปรุงเป็นฉบับของตัวเอง ซึ่งสลับได้ทั้งแบบปกติและแบบ รวมตาราง status = start กับ finish ได้ รวมถึง Export เป็น Excel ในรูปแบบ รวมตาราง status = start กับ finish ได้แล้ว ดังนี้ครับ
2. index.php
3. newsqlformat.php
4. excel2.php

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

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

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


1. testdata.sql (ชื่อ database คือ testdata ครับ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | <?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" > <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" /> <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" > <a href = "newsqlformat.php" >Change to Join Mode</a> <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> $.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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | <?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" > <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" /> <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" > <a href = "index.php" >Change to Normal Mode</a> <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> $.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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | <?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 เดียวกันได้แล้วครับ


ขอบคุณทุกการสนับสนุน
![]()