ต้องแก้ไข 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 ครับ)

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">       
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    <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>
    $.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 "&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 16-04-2020 16:09:28

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

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


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


    ( หรือ เข้าใช้งานผ่าน Social Login )

 ความคิดเห็นที่ 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'





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

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">       
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    <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>
    $.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 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
    โดยการส่งค่าตัวแปรในเงื่อนไข เราต้องใช้เป็นรูปแบบเดียวกับ คือเป็นปี ค.ศ. 
ตัวอย่างเช่น 
 
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
ninenik 19-04-2020
 ความคิดเห็นที่ 4
ขอบคุณครับ สำหรับคำตอบ Code ใช้งานได้แล้ว ซึ่งปรับปรุงเป็นฉบับของตัวเอง ซึ่งสลับได้ทั้งแบบปกติและแบบ รวมตาราง status = start กับ finish ได้ รวมถึง Export เป็น Excel ในรูปแบบ รวมตาราง status = start กับ finish ได้แล้ว ดังนี้ครับ

เพิ้มเติม : บรรทัดตรง 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">       
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    <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>
    $.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">       
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    <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>
    $.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 เดียวกันได้แล้วครับ




Sumate Mephokkij 20-04-2020 20:46
1






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