حسن فاطمي نشر 13 مارس 2021 أرسل تقرير نشر 13 مارس 2021 لدي في قاعدة البيانات حقلين تاريخ (ميلاد- وفاة) .. وأريد طرح هذين الحقلين من بعضهما استخدمت هذا الكود ويعمل بنجاح : $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) وكذلك الأمر بالنسبة للحقل الثاني (الوفاة) .. من ثم تنفيذ الكود المناسب لعملية الطرح ... اتمنى أن تكون الفكرة واضحة لكم .. وشكراً مقدماً .. 1 اقتباس
0 محمد أيت لعرايك نشر 14 مارس 2021 أرسل تقرير نشر 14 مارس 2021 (معدل) إذا كنت لا تريد إستخدام الدالة ()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"); تم التعديل في 14 مارس 2021 بواسطة محمد أيت لعرايك 1 اقتباس
0 Wael Aljamal نشر 13 مارس 2021 أرسل تقرير نشر 13 مارس 2021 بشكل عام عندما نريد التعامل مع نوعين مختلفين من البيانات 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 لكل من المتغيرين لديك واعمل المقارنة بهما 1 اقتباس
0 حسن فاطمي نشر 13 مارس 2021 الكاتب أرسل تقرير نشر 13 مارس 2021 (معدل) شكرا للأخ @Wael Aljamalللرد .. ولكن لن يعمل هذا الحل في حال كان التاريخ مجرد سنة ولا توجد تفاصيل لليوم والشهر $date=date_create("$birth"); //$birth هو حقل الميلاد يحوي مثلا العام 1950 echo date_format($date,"Y/m/d H:i:s"); النتيجة ستكون تاريخ اليوم وبذلك لن تتم عملية الفرق (الطرح) بين الحقلين .. اظن بأن سيظهر الفرق بين السنة الحالية وحقل الوفاة وبهذا نحصل على كم مضى على الوفاة أي الحقل الثاني الموجود عندي تم التعديل في 13 مارس 2021 بواسطة حسن فاطمي اقتباس
0 Wael Aljamal نشر 13 مارس 2021 أرسل تقرير نشر 13 مارس 2021 بتاريخ 14 دقائق مضت قال حسن فاطمي: ولكن لن يعمل هذا الحل في حال كان التاريخ مجرد سنة ولا توجد تفاصيل لليوم والشهر هل يمكنك مشاركة الملف بعد تعديلك له؟ مع تضمين مثال رقمي إن أمكن 1 اقتباس
0 حسن فاطمي نشر 13 مارس 2021 الكاتب أرسل تقرير نشر 13 مارس 2021 شكرا لتجاوبك .. صنعت هذا المثال حسب الكود أعلاه .. ارجو الإطلاع .. $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 حسن فاطمي نشر 14 مارس 2021 الكاتب أرسل تقرير نشر 14 مارس 2021 شكرا لك أخ @محمد أيت لعرايكلتواصلك .. الكود صحيح 100% في حال كان كلا الحقلين (birth و death) يحملان نفس النسق (Y-m-d) .. ولكن قد يمكن أن يكون أحد الحقول لا يحمل سوى السنة (Y) .. وسؤالي كان منذ البداية .. هو كيفية فحص محتوى الحقول فإن كان أحدهما يحوي سنة فقط فيتم تنفيذ أمر معين للطرح .. وإن كان كلاهما يحمل تاريخ كامل يتم تنفيذ أمر آخر .. وإن كانا كلاهما فقط سنوات يتم الطرح بشكل عادي أي الحقلين من بعضهما .. اقتباس
0 محمد أيت لعرايك نشر 14 مارس 2021 أرسل تقرير نشر 14 مارس 2021 (معدل) بتاريخ منذ ساعة مضت قال حسن فاطمي: شكرا لك أخ @محمد أيت لعرايكلتواصلك .. الكود صحيح 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 يمكنك الإطلاع على كيفية إستخدامها من هنا تم التعديل في 14 مارس 2021 بواسطة محمد أيت لعرايك 1 اقتباس
0 Wael Aljamal نشر 14 مارس 2021 أرسل تقرير نشر 14 مارس 2021 بتاريخ 6 دقائق مضت قال حسن فاطمي: أي إنها تصلح لتواريخ معية ولا تصلح لأخرى !! أرجو الاعتماد على الطريقة التي ذكرها محمد وهي تحويل التاريخين لقيمة رقمية و الحساب وفقها فهي أكثر دقة. اقتباس
0 Wael Aljamal نشر 14 مارس 2021 أرسل تقرير نشر 14 مارس 2021 بتاريخ 5 ساعات قال حسن فاطمي: كيفية الاستعلام وفحص الحقل الأول (الميلاد) هل هو تاريخ كامل (Y-m-d) (1970-11-05) أو هو حقل يحتوي تاريخ السنة فقط (Y)(1970) أقترح تنفيذ استعلام SQL يقوم بتوحيد صيغة التواريخ الموجودة مسبقا (في حال عدم وجود يوم أو شهر ضع القيمة 1، أما للساعات و الدقائق و الثواني 0 )، وفي حال إدخال معلومات أخرى يجب إجبار المستخدم على إدخال جميع الحقول لكي لا تتعرض لهذه المشاكل 1 اقتباس
0 حسن فاطمي نشر 14 مارس 2021 الكاتب أرسل تقرير نشر 14 مارس 2021 في حقل الميلاد توجد تواريخ كاملة وأيضاً فقط السنة .. وكذلك الأمر بالنسبة للحقل الثاني .. كان المطلوب فحص هذه الحقول بواسطة شروط لتنفيذ كل حالة لوحدها 1- في حال الحقلان تواريخ كاملة 2- في حال أحد الحقول فقط يحوي السنة 3- في حال كلا الحقلان تحويان السنة فقط 1 اقتباس
السؤال
حسن فاطمي
لدي في قاعدة البيانات حقلين تاريخ (ميلاد- وفاة) .. وأريد طرح هذين الحقلين من بعضهما
استخدمت هذا الكود ويعمل بنجاح :
في حال كان أحد هذا الحقلين يحتوي فقط السنة (ميلاد أو وفاة) أي من دون تفاصيل لليوم والشهر مثلاً (1960) فكيف تتم عملية الطرح .. جربت هذا :
أو كلا الحقلين يحتويان تاريخ لسنوات من دون وجود الشهر واليوم جربت ونجح الأمر :
السؤال هو:
كيفية الاستعلام وفحص الحقل الأول (الميلاد) هل هو تاريخ كامل (Y-m-d) (1970-11-05) أو هو حقل يحتوي تاريخ السنة فقط (Y)(1970)
وكذلك الأمر بالنسبة للحقل الثاني (الوفاة) .. من ثم تنفيذ الكود المناسب لعملية الطرح ...
اتمنى أن تكون الفكرة واضحة لكم .. وشكراً مقدماً ..
10 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.