mysql สอบถามเกี่ยวกับการ select ข้อมูลวันที่จากฐานข้อมูลมาแสดงว่าทำอย่างไร
ลอง Test แล้วได้น่ะครับ
Date :
2014-11-06 16:51:29
By :
mr.win
Code (PHP)
$sql ="select * from table
where CONCAT(SUBSTRING(dte,7,4),'-',SUBSTRING(dte, 4,2),'-',SUBSTRING(dte,1,2))
BETWEEN 'datebegin' AND 'dateend' ";
datebegin และ dateend ต้องเป็นรูปแบบ yyyy-mm-dd นะครับ
และต้องเป็น ปีพศ ด้วยนะครับ หรือจะเป็น วัน เดือน ปี ตอน นำเข้า แล้วมาแปลง ใน php เอาก็ได้ครับ
ถ้าเป็นไปได้ เปลี่ยน type เป็น date ดีกว่าครับ
Date :
2014-11-06 16:54:57
By :
Chaidhanan
ขอบคุณทุกความคิดเห็นครับ ผมจะลองทำตามครับผม ^^
Date :
2014-11-06 22:39:47
By :
udorn555
จากการที่ผมทำตาม คุณ TC Admin บอกปรากฏว่าไม่แสดงผลอะไร ผมเขียน Code ผิดตรงไหนรบกวนดูให้หน่อยครับ
1. database ที่ออกแบบไว้
2. codeที่เขียนไว้ มี 3 ไฟล์
2.1 ไฟล์ connect.php
Code (PHP)
<?
// connect.php
$hostname="localhost";
$username="root";
$password="root";
$dbname="go";
$connect=mysql_pconnect($hostname,$username,$password);
if(!$connect){
echo "<h3> ERROR : ไม่พบDatabase </h3>";
exit();
}
mysql_query("SET character_set_results=utf8");
mysql_query("SET character_set_client=utf8");
mysql_query("SET character_set_connection=utf8");
?>
2.2 ไฟล์ index.php
<? include "connect.php";?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<form method="post" action="show.php">
วันที่เริ่ม<input type="text" name="datebegin"/>
วันสิ้นสุด <input type="text" name="dateend"/>
<input type="submit" name="submit" value="ค้นหา"/>
</form>
</body>
</html>
2.3 ไฟล์ show.php
<? include "connect.php";?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<?
$datebegin = $_POST['datebegin'];
$dateend = $_POST['dateend'];
$sql="SELECT * FROM test WHERE (DATE_ADD(date_format(str_to_date(date_p, '%d/%m/%Y'), '%Y-%m-%d'), INTERVAL -543 YEAR) BETWEEN 'datebegin' AND '$dateend')";
//$sql ="select * from test where CONCAT(SUBSTRING(date_p,1,2),'/',SUBSTRING(date_p,4,2),'/',SUBSTRING(date_p,7,4)) BETWEEN '$datebegin' AND '$dateend' ";
$result= mysql_db_query($dbname,$sql) or die(mysql_error());
?>
<table>
<tr>
<td>วันที่</td>
</tr>
<? while($row=mysql_fetch_array($result)){ ?>
<tr>
<td><?=$row['date_p']?></td>
</tr>
<? }?>
</body>
</html>
Date :
2014-11-06 23:51:39
By :
udorn555
ผลจากการที่ผมทำตามคุณ Chaidhanan บอกปรากฏว่า ข้อมูลออกแต่แสดงข้อมูลไม่ครบ เช่น
ในตารางมีข้อมูล
id date_p
1 01/10/2557
2 02/10/2557
3 01/11/2557
4 07/11/2557
ใส่ช่วงข้อมูลที่ต้องการค้น 01/10/2557 ถึง 01/11/2557 ปรากฏว่าข้อมูลแสดงเพียง 01/10/2557 และ 01/11/2557 ซึ่งขาด 02/10/2557 ไป ผมเขียนผิดยังไง รบกวนช่วยดูให้ด้วยครับ
ไฟล์ Code ที่ผมเขียนมี 3 ไฟล์ ดังข้างล่าง
1. ไฟล์ connect.php
Code (PHP)
<?
// connect.php
$hostname="localhost";
$username="root";
$password="root";
$dbname="go";
$connect=mysql_pconnect($hostname,$username,$password);
if(!$connect){
echo "<h3> ERROR : ไม่พบDatabase </h3>";
exit();
}
mysql_query("SET character_set_results=utf8");
mysql_query("SET character_set_client=utf8");
mysql_query("SET character_set_connection=utf8");
?>
2.ไฟล์ index.php
Code (PHP)
<? include "connect.php";?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<form method="post" action="show.php">
วันที่เริ่ม<input type="text" name="datebegin"/>
วันสิ้นสุด <input type="text" name="dateend"/>
<input type="submit" name="submit" value="ค้นหา"/>
</form>
</body>
</html>
3.ไฟล์ show.php
Code (PHP)
<? include "connect.php";?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<?
$datebegin = $_POST['datebegin'];
$dateend = $_POST['dateend'];
$sql ="select * from test where CONCAT(SUBSTRING(date_p,1,2),'/',SUBSTRING(date_p,4,2),'/',SUBSTRING(date_p,7,4)) BETWEEN '$datebegin' AND '$dateend' ";
$result= mysql_db_query($dbname,$sql) or die(mysql_error());
?>
<table>
<tr>
<td>วันที่</td>
</tr>
<? while($row=mysql_fetch_array($result)){ ?>
<tr>
<td><?=$row['date_p']?></td>
</tr>
<? }?>
</body>
</html>
Date :
2014-11-06 23:58:37
By :
udorn555
โค๊ด คิวรี่ คุณไปเอาวันขึ้นก่อน ครับ ซึ่งวัน มันมี ลำดับ ความสำคัญ น้อยกว่า เดือน
และ เดือน มีความสำคัญ น้อยกว่าปีครับ ซึ่งเป็นการเรียงจาก น้อยไปหามาก
ไม่สามารถ มาเปรียบเทียบ กับ หลักความสำคัญ มาก ไปหา น้อยครับ
01-01-2557 หลักความสำคัญ น้อยกว่า 01-02-2556 แม้ปีจะมากว่า
แต่หลักการเรียงอักษร แล้ว 01-01 น้อยกว่า 01-02 ครับ
Code (PHP)
<?php
list($d1, $m1, $y1) = explode('/', $_POST['datebegin']);
$datebegin = date('Y-m-d', mktime( 0,0,0, $m1, $d1, $y1-543));
list($d2, $m2, $y2) = explode('/', $_POST['dateend']);
$dateend = date('Y-m-d', mktime( 0,0,0, $m2, $d2, $y2-543));
$sql ="select * from test where CONCAT((SUBSTRING(date_p,7,4)-543),'-',SUBSTRING(date_p,4,2),'-',SUBSTRING(date_p,1,2)) BETWEEN '$datebegin' AND '$dateend' ";
$result= mysql_db_query($dbname,$sql) or die(mysql_error());
?>
ปล. โค๊ดแบบ admin ก็ใช้ได้นะครับ แต่ผมไม่นิยมใช้ เพราะ วันที่ 29 กุมภา จะมีปัญหาวันที่ เปลี่ยนเป็นวันที่ 28 อะครับ
Code (SQL)
select DATE_ADD(date_format(str_to_date('29-02-2560', '%d-%m-%Y'), '%Y-%m-%d'), INTERVAL -543 YEAR) d
FROM `table_name` WHERE 1
ประวัติการแก้ไข 2014-11-07 08:50:18 2014-11-07 08:50:48
Date :
2014-11-07 08:32:43
By :
Chaidhanan
เย้ๆๆๆๆ ได้แล้วครับผม ขอบคุณ คุณChaidhanan มากๆ เลยครับ ^^
Date :
2014-11-09 19:21:28
By :
udorn555
ขอเพิ่มเงื่อนไข อีกนิดครับ พอดีต้องการ ให้สามารถ เรียงลำดับ จากวันที่น้อยไปมาก มากไปน้อย ด้วยน่ะครับ ผมเขียน code เพิ่มดังนี้
Code (PHP)
$sql ="select * from go where CONCAT((SUBSTRING(date_p,7,4)-543),'-',SUBSTRING(date_p,4,2),'-',SUBSTRING(date_p,1,2)) BETWEEN '$datebegin' AND '$dateend'ORDER BY date_p desc ";
ปรากฏว่าผลออกมาเป็นแบบนี้
วันที่
02/10/2557
01/11/2557
01/10/2557
อยากให้มันเรียงเป็น
02/10/2557
01/10/2557
01/11/2557
ต้องทำอย่างไรครับผม รบกวนอีกครั้งครับ ^^
Date :
2014-11-10 07:47:33
By :
udorn555
ลองทำหลายครังละไม่ได้ครับผม
Date :
2014-11-13 08:22:40
By :
udorn555
Code (SQL)
order by CONCAT((SUBSTRING(date_p,7,4)-543),'-',SUBSTRING(date_p,4,2),'-',SUBSTRING(date_p,1,2))
Date :
2014-11-13 08:31:19
By :
Chaidhanan
ได้ละครับ ขอบคุณ คุณChaidhanan มากๆครับผม ^___^
Date :
2014-11-17 05:29:36
By :
udorn555
Load balance : Server 04