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

السؤال

نشر

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

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

$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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...