Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,027

HOME > PHP > PHP Forum > ขอคำแนะนำเรื่อง ---> การหาส่วนต่างของเวลาที่เริ่ม และสิ้นสุดในแต่ละครั้ง



 

ขอคำแนะนำเรื่อง ---> การหาส่วนต่างของเวลาที่เริ่ม และสิ้นสุดในแต่ละครั้ง

 



Topic : 088566



โพสกระทู้ ( 31 )
บทความ ( 0 )



สถานะออฟไลน์




ขอคำแนะนำหน่อยค่ะ ++++++++++++++++

เรื่องการหาส่วนต่างของเวลาที่เริ่ม และสิ้นสุดในแต่ละครั้งค่ะ ใน DB มี ฟิลล์ที่ชื่อ ว่า Starttime, Stoptime ค่ะ หนูเข้าไปดูใน DB <ซึ่งหนูมีสิทธิ์แค่ดูอย่างเดียว> สองฟิลล์นี้ถูกเซต Data Type -- > int
เก็บค่าเป็น 1-24 ค่ะ :) ขอบคุณค่ะ

$strSQL = "SELECT SUM(StopTime-StartTime) AS SumTime FROM Table ";


ทีแรกหนูเขียน sql แบบนี้ค่ะ แต่มันใช้ไม่ได้ T^T พอเจอค่าเริ่มมีตัวเลขมากกว่าหน่อย ก็ติดลบค่ะ

T_______________________T



Tag : PHP, Ms SQL Server 2005, Windows







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2012-12-26 14:38:11 By : myGypz View : 1355 Reply : 8
 

 

No. 1



โพสกระทู้ ( 2,249 )
บทความ ( 5 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Facebook Hi5 Blogger

ดึงแบบนี้ไม่ได้หรอครับ

Code
$strSQL = "SELECT StopTime,StartTime FROM Table ";


แล้วค่อยเอา StopTime-StartTime ครับแต่หากจะให้แนะนำควรเก็บเวลาเป็น Datetime หรือ timestamp ไปเลยครับแล้วใช้ function นี้คำนวนครับ

Code (PHP)
function duration($begin,$end){
	$remain=intval(strtotime($end)-strtotime($begin));
	$wan=floor($remain/86400);
	$l_wan=$remain%86400;
	$hour=floor($l_wan/3600);
	$l_hour=$l_wan%3600;
	$minute=floor($l_hour/60);
	$second=$l_hour%60;
	return "ผ่านมาแล้ว ".$wan." วัน ".$hour." ชั่วโมง ".$minute." นาที ".$second." วินาที";
}







แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-12-26 21:42:44 By : Manussawin
 


 

No. 2



โพสกระทู้ ( 314 )
บทความ ( 0 )



สถานะออฟไลน์


มี 2 ประเด็นนะครับคือ

1. ถ้าต้องการให้การคำนวนเวลา โดยให้ database เป็นผู้คำนวน ก็ใช้ฟังก์ชั่นของ database นั้นๆได้ เช่น TIMEDIFF
แต่การใช้วิธีนี้ก็จะทำให้ภาระตกไปอยู่ที่ Database เพราะฉะนั้นควรจะใช้ในกรณีที่ไม่เยอะจนเกินไปในการคิวรี่ในแต่ละครั้ง

SELECT StopTime, StartTime TIMEDIFF(StopTime, StartTime) as time_diff FROM Table

2. ถ้าต้องการให้ Server เป็นผู้คำนวนเวลาให้ ก็เขียนเป็นฟังก์ชั่นแบบที่คุณ "Manussawin" แนะนำครับ วิธีนี้ภาระไปตกอยู่ที่ Server เพราะคิวรี่ให้เสร็จก่อนแล้วจึงนำผลที่ได้มาคำนวนอีกทีที่ Server
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-12-27 08:56:10 By : Songkram
 

 

No. 3



โพสกระทู้ ( 31 )
บทความ ( 0 )



สถานะออฟไลน์


DB มันต้องดึงมาจากอีกที่นึงอ่ะค่ะ เค้าอนุญาตให้ดูได้อย่างเดียว :(
data type เป็น int ค่ะ เก็บค่าเป็น 0-23 ค่ะ


Code
<?php
$objConnect = mssql_connect("////", "///", "///") or die("Error Connection to Database");
$objDB = mssql_select_db("myDB");

$strSQL = "SELECT StopTime,StartTime FROM table WHERE Service='email' AND StartDate >= '2012-01-26' and StopDate < '2012-12-25'";
$objQuery = mssql_query($strSQL) or die("Error Query [".$strSQL."]");
?>
<?php
function duration($begin,$end){
$remain=intval(strtotime($end)-strtotime($begin));
$wan=floor($remain/86400);
$l_wan=$remain%86400;
$hour=floor($l_wan/3600);
$l_hour=$l_wan%3600;
$minute=floor($l_hour/60);
$second=$l_hour%60;
return "ผ่านมาแล้ว ".$wan." วัน ".$hour." ชั่วโมง ".$minute." นาที ".$second." วินาที";
}
?>
<?php echo duration($StartTime,$StopTime);?>



ใส่แบบนี้ถูกป่ะคะ ผลลัพธ์มันขึ้นงี้ค่ะ ---- > ผ่านมาแล้ว 0 วัน 0 ชั่วโมง 0 นาที 0 วินาที ไม่มีเวลาเกิดขึ้น



รบกวนหน่อยนะคะ ขอบคุณค่ะ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-12-27 08:58:14 By : myGypz
 


 

No. 4



โพสกระทู้ ( 31 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 2 เขียนโดย : Songkram เมื่อวันที่ 2012-12-27 08:56:10
รายละเอียดของการตอบ ::
ขอบคุณค่ะ (:

แล้วในกรณีที่เราไม่สามารถแก้ไขฐานข้อมูลได้เลย เพราะเค้าให้สิทธิ์แค่ view อย่างเดียวนี่เราสามารถใช้ TIMEDIFF ได้รึป่าวคะ ?
เพราะ data type มันเป็น int และเก็บค่า เป็น 0-23

Code (PHP)
<?php
$objConnect = mssql_connect("///", "///", "///") or die("Error Connection to Database");
$objDB = mssql_select_db("myDB");

$strSQL = "SELECT StopTime,StartTime TIMEDIFF(StopTime,StartTime) as time_diff FROM table WHERE Service='Email' AND StartDate >= '2012-01-26' and StopDate < '2012-12-25'";
$objQuery = mssql_query($strSQL) or die("Error Query [".$strSQL."]");
?>
<table width="90%" align="center" >
<?php
while($objResult=mssql_fetch_array($objQuery)){
?>
<tr align="center" bgcolor="">
<td align="right" width="52%"><b>จำนวนชั่วโมงที่ service ตกในเดือนนี้ =&nbsp;&nbsp;&nbsp;</b> </td>
<td align="left" width="50%"><?php echo $objResult["time_diff"];?> <b> ชั่วโมง</b></td>
</tr>

<?php
}
?>

</table>


แล้วมัน error ตามนี้ค่ะ

Code
Warning: mssql_query() [function.mssql-query]: message: Incorrect syntax near 'StopTime'. (severity 15) in C:\wamp\www\New folder\t_TT.php on line 6

Warning: mssql_query() [function.mssql-query]: Query failed in C:\wamp\www\New folder\t_TT.php on line 6



ขอบคุณค่ะ (:

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-12-27 09:10:21 By : myGypz
 


 

No. 5



โพสกระทู้ ( 314 )
บทความ ( 0 )



สถานะออฟไลน์


เนื่องจากรูปแบบของข้อมูลไม่ใช่วันที่ จึงไม่สามารถใช้ TIMEDIFF ได้ครับ
เพราะฉะนั้น น่าจะใช้วิธีที่ 2 คือคิวรี่ออกมาก่อนแล้วเข้าฟังก์ชั่น

ประเด็นแรก ข้อมูลคือ int เป็นตัวเลข 0-23 แสดงว่าฟิลดิ์นี้เก็บแค่เวลาเป็นชั่วโมงหรือเปล่าครับ
ถ้าต้องการคำนวนเวลา ก็ได้แค่ผลต่างชั่วโมงเท่านั้นนะครับ

แต่ถ้าต้อการเวลาที่ละเอียดก็ต้องเก็บข้อมูลในฟิลดิ์นี้ให้ละเอียดขึ้นนะครับ

ถ้าใช้ฟิลดิ์วันที่อีกฟิลดิ์มาประกอบก็จะได้จำนวนวันกับชั่วโมงเท่านั้น....

เพราะฉะนั้นต้องถามก่อนว่าข้อมูล วัน เวลา ที่มีอยู่เป็นแบบไหน และต้องการแบบไหนครับ
เพราะถ้าเป็นแค่ int แบบที่ว่ามาก็ได้แค่ผลต่างชั่วโมงเท่านั้นครับ

สำหรับตัวอย่างการใช้ฟังก์ชั่น date_diff ของ php ก็ตามลิงค์นี้เลยครับ

http://php.net/manual/en/function.date-diff.php
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-12-27 10:17:26 By : Songkram
 


 

No. 6



โพสกระทู้ ( 31 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 5 เขียนโดย : Songkram เมื่อวันที่ 2012-12-27 10:17:26
รายละเอียดของการตอบ ::
ใช่ค่ะ เก็บค่าเวลาเป็น ชม. ต้องการคิดส่วนต่างเป็นชม. ค่ะ
เช่น StartTime 22 StopTime 2 แล้วได้ส่วนต่างเป็น 4 อ่ะค่ะ

T^T
ขอบคุณมากค่ะ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-12-27 10:30:03 By : myGypz
 


 

No. 7



โพสกระทู้ ( 314 )
บทความ ( 0 )



สถานะออฟไลน์


Code (PHP)
// เขียนฟังก์ชั่นแบบนี้เพราะเจ้าของกระทู้มีฟิลดิ์วันที่กับฟิลดิ์ชั่วโมงแยกกันอยู่
// ถ้าต้องการให้แสดงละเอียดถึงขั้น นาที และวินาทีก็สามารถทำได้
// จากข้อมูลของเจ้าของกระทู้มีเวลาเป็นชั่วโมงมาเท่านั้น
// เพราะฉะนั้นต้องปรับรูปแบบวันที่และเวลาให้เป็นรูปแบบด้านบนนี้ก่อน
// คุณต้องเอา StartDate กับ StartTime และ StopDate กับ StopTime
// มาประกอบร่างกันก่อน ให้เหมือนกับข้อมูลตัวอย่าง
// ข้อมูลตัวอย่าง ถ้าไม่มีนาที และ วินาทีก็ใส่เป็น 00 ได้

$StartDate = '2012-01-01 22:15:05';
$StopDate = '2012-01-03 02:05:14';


function TimeDuration($TimeStart, $TimeStop){ 

	$TStart = new DateTime($TimeStart);
	$TStop = new DateTime($TimeStop);
	$init_time = mktime($TStart->format('H'),$TStart->format('i'),$TStart->format('s'),$TStart->format('m'),$TStart->format('d'),$TStart->format('Y'));	
	$dst_time = mktime($TStop->format('H'),$TStop->format('i'),$TStop->format('s'),$TStop->format('m'),$TStop->format('d'),$TStop->format('Y'));
	$TimeDuration = $dst_time - $init_time;

	$day = intval( $TimeDuration / 86400 ); // จำนวนวัน
	$hours = intval( ( $TimeDuration % 86400 ) / 3600 ); // จำนวน ชั่วโมง
	$mins = intval( ( ( $TimeDuration % 86400 ) % 3600 ) / 60 ); // จำนวน นาที
	$secs = intval( ( ( ( $TimeDuration % 86400 ) % 3600) % 60 ) ); // จำนวน วินาที

	return "Duration ".$day." day ".$hours." hours ".$mins." minute ".$secs." second";

}

echo TimeDuration($StartDate, $StopDate);
echo '<br>';

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-12-27 15:17:52 By : Songkram
 


 

No. 8



โพสกระทู้ ( 11,835 )
บทความ ( 10 )

สมาชิกที่ใส่เสื้อไทยครีเอท Hall of Fame 2012

สถานะออฟไลน์


select sum(tmp.DiffTime) from
(
SELECT StopTime-StartTime as DiffTime FROM Table
) tmp

ลองดูว่าได้ไหม
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-12-27 15:28:13 By : ikikkok
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : ขอคำแนะนำเรื่อง ---> การหาส่วนต่างของเวลาที่เริ่ม และสิ้นสุดในแต่ละครั้ง
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 01
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่