PDA

View Full Version : محاسبه فاصله زمانی بین دو تاریخ در دیتابیس و سپس محاسبه درصد باقی مانده



saeed-71
دوشنبه 15 اردیبهشت 1393, 11:29 صبح
سلام.
من برای زمان تحوبل نمونه کارها میخوام درصد پیشرفت بذارم.
میخوام بر اساس فاصله زمانی تاریخ شروع پروژه و زمان تعیین شده برای تحویل پروژه درصد تعیین کنم که پروژه چند درصد پیشرفت کرده است؟
چجوری این کار رو کنم؟
من بر تاریخ رو وارد میکنم بر اساس میلادی و نوع فیلد رو هم date قرار میدم.
نحوه محاسبه چجوریه؟
ممنون.

Unique
دوشنبه 15 اردیبهشت 1393, 13:53 عصر
والا تا اونجا که من میدونم پروژه ممکنه مثلا توی دو هته برای هفته اول ۳۰ درصد رشد کنه و هفته دوم ۷۰ درصد ! اما اگه منظورتون این هکه بر اساس زمان از دست رسته درصد بدیم اینطوریه :


select (100 - ((DATEDIFF(fld_deadline,CURDATE()) * 100) / DATEDIFF(fld_deadline,fld_start))) prc from projects

فقط موفقع نمایش prc پس از روز deadline از ۱۰۰ بزرگتر میشه که باید همون ۰ یعنی پروژه تموم شده فرض بشه ! تست نکردم اما اصولش همینه و باید جواب بده.

plague
دوشنبه 15 اردیبهشت 1393, 14:16 عصر
اگه نخای از دیتابیس مستقیما کوئری بگیری
میتونی با استفاده از تابع strtotime تاریخ آغاز و پایان رو تبدیل کنی به عدد های 10 رقمی
عدد زمان حال رو هم میتونی با تابع time() به دست بیاری
در این حالت 3 تاریخ با فرمت عددی خواهی داشت که میشه با راحتی محاسبه کرد چند درصدش گزشته

saeed-71
دوشنبه 15 اردیبهشت 1393, 17:12 عصر
ممنونم چجوری این اعدا به دست اومده رو به تعداد روز تبدیل کنم؟
یعنی وقتی تفریقشون کردن گفت میشه فلان عدد حالا از کجا بدونم میشه چند روز؟


$start = jdate("Y/m/d", strtotime($rows['start']));
$last = jdate("Y/m/d", strtotime($rows['last']));

$tend = strtotime($rows['last']);
$now = time();
echo $now.'<br>';
echo $tend.'<br>';
echo $tafrigh = $tend - $now.'<br>';
echo date("Y/m/d",$tafrigh).'<br>';

foreach
دوشنبه 15 اردیبهشت 1393, 18:01 عصر
ممنونم چجوری این اعدا به دست اومده رو به تعداد روز تبدیل کنم؟
یعنی وقتی تفریقشون کردن گفت میشه فلان عدد حالا از کجا بدونم میشه چند روز؟


$start = jdate("Y/m/d", strtotime($rows['start']));
$last = jdate("Y/m/d", strtotime($rows['last']));

$tend = strtotime($rows['last']);
$now = time();
echo $now.'<br>';
echo $tend.'<br>';
echo $tafrigh = $tend - $now.'<br>';
echo date("Y/m/d",$tafrigh).'<br>';

خوب وقتی ثانیه رو داشته باشید میتونید خیلی راحت روز و ساعت و دقیقه رو به دست بیارید
به طور مثال برای به دست آوردن تعداد روز های باقیمانده


echo ($end-$start)/86400;

plague
دوشنبه 15 اردیبهشت 1393, 21:27 عصر
strtotime در واقع میاد تاریخ رو به ثانیه تبدیل میکنه (یکم پیچیده تر از اینه ولی شما همینقدر رو داشته باش )
هر روز 86400 ثانیست

کافیه زمان حال رو بگیری و کم کنی از زمان شروع (در حالت ثانیه ) که بهت میگه چند ثانیه گزشته از زمان شروع تا الان
اونوقت تقسیم بر 86400 کنی در میاد که چند روز گزشته

Unique
چهارشنبه 17 اردیبهشت 1393, 12:33 عصر
چون فیلد شما DATE هست و mysql تابع DATEDIFF را برای محاسبه فاصله روزهای بین دو تاریخ داره. بهترین performance با query مستقیم حاصل میشه.

engmmrj
چهارشنبه 17 اردیبهشت 1393, 15:23 عصر
والا تا اونجا که من میدونم پروژه ممکنه مثلا توی دو هته برای هفته اول ۳۰ درصد رشد کنه و هفته دوم ۷۰ درصد ! اما اگه منظورتون این هکه بر اساس زمان از دست رسته درصد بدیم اینطوریه :


select (100 - ((DATEDIFF(fld_deadline,CURDATE()) * 100) / DATEDIFF(fld_deadline,fld_start))) prc from projects

فقط موفقع نمایش prc پس از روز deadline از ۱۰۰ بزرگتر میشه که باید همون ۰ یعنی پروژه تموم شده فرض بشه ! تست نکردم اما اصولش همینه و باید جواب بده.
میشه بگید DATEDIFF و CURDATE() چیکار می کنند ؟