اذهب إلى المحتوى
  • 0

الحصول على الفرق بين تاريخين

حسن فاطمي

السؤال

لدي في قاعدة البيانات حقلين تاريخ (ميلاد- وفاة) .. وأريد طرح هذين الحقلين من بعضهما

استخدمت هذا الكود ويعمل بنجاح :

$bday = new DateTime($birth);
$today = new Datetime($death);
$diff = $today->diff($bday);
							 
printf('%d سنة %d شهر %d يوم', $diff->y, $diff->m, $diff->d);
printf("\n");	

في حال كان أحد هذا الحقلين يحتوي فقط السنة (ميلاد أو وفاة) أي من دون تفاصيل لليوم والشهر مثلاً (1960) فكيف تتم عملية الطرح .. جربت هذا :

$old = strtotime($death);
$dth = date('Y',$old);

أو كلا الحقلين يحتويان تاريخ لسنوات من دون وجود الشهر واليوم جربت ونجح الأمر : 

$res = $birth - death;
echo "$res";

السؤال هو:

كيفية الاستعلام وفحص الحقل الأول (الميلاد) هل هو تاريخ كامل (Y-m-d) (1970-11-05) أو هو حقل يحتوي تاريخ السنة فقط (Y)(1970)

وكذلك الأمر بالنسبة للحقل الثاني (الوفاة) .. من ثم تنفيذ الكود المناسب لعملية الطرح ...

اتمنى أن تكون الفكرة واضحة لكم .. وشكراً مقدماً ..

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

إذا  كنت لا تريد إستخدام الدالة ()diff و تريد حساب الفرق بين تاريخين بالسنوات و الأشهر و الأيام  فيمكنك إستخدام الطريقة التالية:

$birth = "1956-03-24";  //تاريخ الولادة
$death = "2009-06-26";  // تاريخ الوفاة

$diff = abs(strtotime($death) - strtotime($birth));  // حساب الفرق الموجب بين التاريخين

$years = floor($diff / (365*60*60*24));  // حساب عدد السنوات

$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));// حساب عدد الأشهر

$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24)); // حساب عدد الأيام

printf('%d سنة %d شهر %d يوم', $years, $months, $days);  // طباعة النتيجة
printf("\n");

 

تم التعديل في بواسطة محمد أيت لعرايك
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

بشكل عام عندما نريد التعامل مع نوعين مختلفين من البيانات data types أو متغيرين من نفس النمط لكن مكتوب بتنسيق مختلف format، علينا تحويل القيمتين لقيمة عامة أو حيادية أو شاملة بحيث نستطيع فيها الاحتفاظ بجميع القيم السابقة لكل قيمة (مثلا الأعداد العشرية في حال التعامل مع float - double) , وغيرها. فالحل هنا هو تحويل النمطين لتاريخ كامل و التعامل معه.

يمكنك استخدام الدالة التالية date_format لتجويل نمط التاريخ ليشمل جميع تفاصيل التاريخ و من ثم المقارنة.

<?php
$date=date_create("2013-03-15");
echo date_format($date,"Y/m/d H:i:s");
?>

قم بحفظ ناتج date_format لكل من المتغيرين لديك واعمل المقارنة بهما

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

شكرا للأخ @Wael Aljamalللرد .. 

ولكن لن يعمل هذا الحل في حال كان التاريخ مجرد سنة ولا توجد تفاصيل لليوم والشهر

$date=date_create("$birth");  //$birth هو حقل الميلاد يحوي مثلا العام 1950
echo date_format($date,"Y/m/d H:i:s");

النتيجة ستكون تاريخ اليوم وبذلك لن تتم عملية الفرق (الطرح) بين الحقلين ..

اظن بأن سيظهر الفرق بين السنة الحالية وحقل الوفاة وبهذا نحصل على كم مضى على الوفاة أي الحقل الثاني الموجود عندي

تم التعديل في بواسطة حسن فاطمي
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 14 دقائق مضت قال حسن فاطمي:

ولكن لن يعمل هذا الحل في حال كان التاريخ مجرد سنة ولا توجد تفاصيل لليوم والشهر

 

هل يمكنك مشاركة الملف بعد تعديلك له؟

مع تضمين مثال رقمي إن أمكن

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

شكرا لتجاوبك .. صنعت هذا المثال حسب الكود أعلاه .. ارجو الإطلاع ..

$birth2 = '1910';
$death2 = '1980';

$date1 = date_create("$birth2");
$d1 = date_format($date1,"Y-m-d H:i:s");

$date2 = date_create("$death2");
$d2 = date_format($date2,"Y-m-d H:i:s");

$s1 = new DateTime($d1);
$s2 = new Datetime($d2);
$diff = $s2->diff($s1);

echo " $diff->y سنة و $diff->m شهر و $diff->d يوم ";

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

شكرا لك أخ @محمد أيت لعرايكلتواصلك ..

الكود صحيح 100% في حال كان كلا الحقلين (birth و death) يحملان نفس النسق (Y-m-d) ..

ولكن قد يمكن أن يكون أحد الحقول لا يحمل سوى السنة (Y) ..

وسؤالي كان منذ البداية .. هو كيفية فحص محتوى الحقول فإن كان أحدهما يحوي سنة فقط فيتم تنفيذ أمر معين للطرح .. وإن كان كلاهما يحمل تاريخ كامل يتم تنفيذ أمر آخر .. وإن كانا كلاهما فقط سنوات يتم الطرح بشكل عادي أي الحقلين من بعضهما ..

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ منذ ساعة مضت قال حسن فاطمي:

شكرا لك أخ @محمد أيت لعرايكلتواصلك ..

الكود صحيح 100% في حال كان كلا الحقلين (birth و death) يحملان نفس النسق (Y-m-d) ..

ولكن قد يمكن أن يكون أحد الحقول لا يحمل سوى السنة (Y) ..

وسؤالي كان منذ البداية .. هو كيفية فحص محتوى الحقول فإن كان أحدهما يحوي سنة فقط فيتم تنفيذ أمر معين للطرح .. وإن كان كلاهما يحمل تاريخ كامل يتم تنفيذ أمر آخر .. وإن كانا كلاهما فقط سنوات يتم الطرح بشكل عادي أي الحقلين من بعضهما ..

يمكنك أن تتحقق من تاريخ معين في PHP بكل سهولة عن طريق تحويل التاريخ إلى string بعد ذلك تستعمل الدالة التالية.

$birth = '2000-02-15';
$birth_arr  = explode('-', $birth);
if (checkdate($birth_arr[2], $birth_arr[1], $birth_arr[0])) {
   // التاريخ صحيح ويحتوي على الشهر واليوم والسنة
  
}else if($birth_arr[0] && !$birth_arr[1] && !$birth_arr[2]){  //  هنا تتأكد أنه لايوجد يوم ولا شهر فقط سنة
  // التاريخ على شكل سنة
}

هنا قمت بإستعمال الدالة checkdate في PHP يمكنك الإطلاع على كيفية إستخدامها من هنا

تم التعديل في بواسطة محمد أيت لعرايك
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 6 دقائق مضت قال حسن فاطمي:

أي إنها تصلح لتواريخ معية ولا تصلح لأخرى !!

أرجو الاعتماد على الطريقة التي ذكرها محمد وهي تحويل التاريخين لقيمة رقمية و الحساب وفقها فهي أكثر دقة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 5 ساعات قال حسن فاطمي:

كيفية الاستعلام وفحص الحقل الأول (الميلاد) هل هو تاريخ كامل (Y-m-d) (1970-11-05) أو هو حقل يحتوي تاريخ السنة فقط (Y)(1970)

أقترح تنفيذ استعلام SQL يقوم بتوحيد صيغة التواريخ الموجودة مسبقا (في حال عدم وجود يوم أو شهر ضع القيمة 1، أما للساعات و الدقائق و الثواني 0 )، وفي حال إدخال معلومات أخرى يجب إجبار المستخدم على إدخال جميع الحقول لكي لا تتعرض لهذه المشاكل

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

في حقل الميلاد توجد تواريخ كاملة وأيضاً فقط السنة .. وكذلك الأمر بالنسبة للحقل الثاني ..

كان المطلوب فحص هذه الحقول بواسطة شروط لتنفيذ كل حالة لوحدها

1- في حال الحقلان تواريخ كاملة

2- في حال أحد الحقول فقط يحوي السنة

3- في حال كلا الحقلان تحويان السنة فقط

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...