الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الفرق بين تاريخين

بدأه himanasser في 18 يناير 2014 · 4 رد · 775 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اخوتي اريد المقارنة بين التاريخ والحالي وقائمة من التواريخ مستخرجة من قاعدة البيانات وفي حالة انه الفرق اكبر من 20 يوم يطبع باقي بيانات هذا السجل 

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

 

وجزاكم الله خيرا

	public List<Date> findAllEndDate() {
		Date date = null;
		List<Date> eqamaList = new ArrayList<Date>();
		transaction = session.beginTransaction();
		try{
			eqamaList = criteria.setProjection(Projections.property("endDate")).list();
			for(iterator = eqamaList.iterator();iterator.hasNext();)
				date = (Date) iterator.next();
			transaction.commit();
		} catch(HibernateException e){
			e.printStackTrace();
		}
	 Calendar cal1 = new GregorianCalendar();
	 Calendar cal2 = new GregorianCalendar();

	 for(Date date2 : eqamaList){
		 Date d1, d2;
	 if(daysBetween(date2,cal2.getTime()) < 20){
		 System.out.println(daysBetween(date2,cal2.getTime()) > 20);

	 }else{
		 System.out.println("non");

	 }
	 
	 
	 }
	 return eqamaList;
	 }
	
	public int daysBetween(Date d1, Date d2){
	
      int daydiff =  (int) (d1.getTime() - d2.getTime()) / (1000 * 60 * 60 * 24);
      return daydiff;
	}
#2

السلام عليكم ..

الاكواد غير متناسقة منطقيا ...

في تطبيقات قواعد البيانات , يفضل فلترة البيانات في السيرفر مباشرة , بدلا من نقلها كلها ثم فلترتها عند الكلاينت...

يعني مباشرة قم بتنفيذ الاستعلام : 

SELECT *   FROM  eqama  WHERE  DateDiff(NOW(), endDate) > 20 ;

حيث :

SELECT DATEDIFF('2011-08-17','2011-08-17'); --  0 day
SELECT DATEDIFF('2011-08-17','2011-08-08'); --  9 days
SELECT DATEDIFF('2011-08-08','2011-08-17'); -- -9 days

هذا في mysql  ..

أما طريقة تنفيذ استعلام في هايبرنيت فهي في الرابط:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html

 

هذا مثال على قلترة list  من التواريخ ..

java.util.Calendar cal = java.util.Calendar.getInstance();
        Date now = cal.getTime();
        ArrayList<java.util.Date> eqamaList = new ArrayList<java.util.Date>();
        java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("dd-MM-yyyy");
        eqamaList.add(format.parse("01-01-2014"));
        eqamaList.add(format.parse("02-01-2014"));
        eqamaList.add(format.parse("15-01-2014"));
        for (Date dateLoop : eqamaList)
        {
            int theDiff = daysBetween(now, dateLoop);
            if ( theDiff > 15)
            {
                System.out.print(dateLoop);
                System.out.println("----" + theDiff);
            }
        }

بانتظار ردود خبراء الجافا .

تم تعديل هذه المشاركة بواسطة حسام الشامي في 18 يناير 2014 في 12:41

1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

انا حليتها بس لسه مش المخرجات مش مزبوطة انا عايز بدل ما يطلع التاريخ تطلعلي باقي بيانات الريكورد بتاع التاريخ 

	public List<Date> findAllEndDate() {
		Date date = null;
		List<Date> eqamaList = new ArrayList<Date>();
		transaction = session.beginTransaction();
		try{
//			Query query = session.createQuery("");
			eqamaList = criteria.setProjection(Projections.property("endDate")).list();
			for(iterator = eqamaList.iterator();iterator.hasNext();)
				date = (Date) iterator.next();
			for(Date date2 : eqamaList){
			int diffInDays = (int)( (date2.getTime() - new Date().getTime()) 
	                 / (1000 * 60 * 60 * 24) );
			if(diffInDays < 5){
//			System.out.println( diffInDays +"\t"+ date2.toString());
			System.out.println(diffInDays +" "+ SDRService.getInstance().getEqamaSrv().getEqamaInstance()
					.findByEndDate(date2));

			}
			}
			transaction.commit();
		} catch(HibernateException e){
			e.printStackTrace();
		}
		return eqamaList;
	}
#4

السلام عليكم ....

عندما نضع Projection  هذا يكافئ تحديد الأعمدة المعادة , يعني الكود :

eqamaList = criteria.setProjection(Projections.property("endDate")).list();

 يكافئ عبارة سيكوال :

SELECT endDate FROM Eqama

 و بالتالي الناتج سيكون من نوع :

List<Date>

الحل , نعمل دون Projection  كي يعيد لنا كل الحقول و تكون النتبيجة من النوع :

List<Eqama>

يكون الكود كاملا :

import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Test
{

  
    public static void main(String[] args)
    {
        SessionFactory factory = new Configuration().configure().buildSessionFactory();
        Session session = factory.openSession();
        Transaction tx = null;
        try
        {
            tx = session.beginTransaction();
            List eqamaList = session.createQuery("FROM Eqama").list();

            for (Iterator iterator = eqamaList.iterator(); iterator.hasNext();)
            {

                Eqama eqama = (Eqama) iterator.next();
                int diffInDays = (int) ((eqama.getEndDate().getTime() - new Date().getTime()) / (1000 * 60 * 60 * 24));
                System.out.println(diffInDays);
                if (diffInDays > 5)
                {
                    System.out.print("  ID: " + eqama.getId());
                    System.out.print("First Name: " + eqama.getFirstName());
                    System.out.println("  endDate: " + eqama.getEndDate());
                }
            }
            tx.commit();
        } catch (HibernateException e)
        {
            if (tx != null)
                tx.rollback();
            e.printStackTrace();
        } finally
        {
            session.close();
        }

    }
}

يمكن الفلترة في قاعدة البيانات مباشرة , بتعديل الاستعلام كي يكون كالتالي :

List eqamaList = session.createQuery("FROM Eqama WHERE  DateDiff(NOW(), endDate) > 20").list();

حيث الكلاس Eqama  بالشكل :

import java.util.Date;


public class Eqama implements java.io.Serializable
{

    private Short id;
    private String firstName;
    private Date endDate;

    public Eqama()
    {
    }

    public Eqama(Short ID, String firstName, String lastName, Date endDate)
    {
        this.id = ID;
        this.firstName = firstName;
        this.endDate = endDate;
    }

    public Short getId()
    {
        return this.id;
    }

    public void setId(Short actorId)
    {
        this.id = actorId;
    }

    public String getFirstName()
    {
        return this.firstName;
    }

    public void setFirstName(String firstName)
    {
        this.firstName = firstName;
    }

    public Date getEndDate()
    {
        return this.endDate;
    }

    public void setEndDate(Date lastUpdate)
    {
        this.endDate = lastUpdate;
    }
}

ملاحظة هامشية : كما ذكرت سابقا , الأكواد غير متناسقة منطقيا , مثلا هذا الكود :

for(iterator = eqamaList.iterator();iterator.hasNext();)
				date = (Date) iterator.next();

مالفائدة منه , إذا كنا نعمل حلقة على كل الأسطر و نسند القيمة من الحلقة لمتحول !!!!! في النهاية سيأخذ المتحول قيمة آخر سجل ... دون فائدة ..

تم تعديل هذه المشاركة بواسطة حسام الشامي في 19 يناير 2014 في 00:51

1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#5
اقتباس

 

 

java.util.Calendar cal = java.util.Calendar.getInstance();
        Date now = cal.getTime();
        ArrayList<java.util.Date> eqamaList = new ArrayList<java.util.Date>();
        java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("dd-MM-yyyy");
        eqamaList.add(format.parse("01-01-2014"));
        eqamaList.add(format.parse("02-01-2014"));
        eqamaList.add(format.parse("15-01-2014"));
        for (Date dateLoop : eqamaList)
        {
            int theDiff = daysBetween(now, dateLoop);
            if ( theDiff > 15)
            {
                System.out.print(dateLoop);
                System.out.println("----" + theDiff);
            }
        }

مواضيع مشابهة