2016-04-18 67 views
1

我尝试选择用户第一次登录平台。每个用户可以在一天内多次进入该平台,并且在第一次选择时遇到问题。每个用户每天选择第一个登录时间

数据库访问类:

package poin; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 
import java.util.ArrayList; 
import java.util.List; 

public class DataBase { 
    Connection conn ; 
    Statement stmt; 
    List<Join> list = new ArrayList<Join>(); 

    public DataBase(){ 
     super(); 
    } 

    public List<Join> getCard() throws Exception { 

     try{ 
      Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
      conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;user=****;password=*******;database=********"); 

      stmt = conn.createStatement(); 

      String sql = "SELECT [Id] ,[Last Name] ,[First Name],[Field Time] FROM [******].[dbo].[Jointur] order by [Field Time]"; 

      ResultSet rs = stmt.executeQuery(sql); 

      //STEP 5: Extract data from result set 
      //rs.beforeFirst(); 
      //rs.next(); 
      //Join obj =new Join(); FAUTE CAR NOUS AVONS CR2ER UN SEUL OBJET POUR TOUTE ARRAY LIST IL FAUT ETRE A L INTERIEUR DE LA BOUCLE VOIR LA BOUCLE 

      while(rs.next()) 
      { 
       Join obj =new Join();// 
       //Retrieve by column name 
       obj.setCardHolderId(rs.getInt("ID")); 

       obj.setNom(rs.getString("Last Name")); 
       obj.setPrenom(rs.getString("First Name")); 

       obj.setFieldTime(rs.getDate("Field Time")); 
       obj.setTimestamp(rs.getTimestamp("Fiel Time")); 

       list.add(obj); 
      }      

      rs.close(); 
      stmt.close(); 
      conn.close(); 
      } 
      catch (ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return list; 
    } 
} 

加入类;这个类包含插入ArrayList中对象的类型:

package poin; 

import java.sql.Timestamp; 
import java.util.Date; 

public class Join { 

    private int cardHolderId; 
    private String Nom; 
    private String Prenom; 
    private Date fieldTime; 
    private Timestamp timestamp; 

    public Timestamp getTimestamp() { 
     return timestamp; 
    } 

    public void setTimestamp(Timestamp timestamp) { 
     this.timestamp = timestamp; 
    } 

    public Join() { 
     super(); 
    } 

    public int getCardHolderId() { 
     return cardHolderId; 
    } 

    public void setCardHolderId(int cardHolderId) { 
     this.cardHolderId = cardHolderId; 
    } 

    public String getNom() { 
     return Nom; 
    } 

    public void setNom(String nom) { 
     Nom = nom; 
    } 

    public String getPrenom() { 
     return Prenom; 
    } 

    public void setPrenom(String prenom) { 
     Prenom = prenom; 
    } 

    public Date getFieldTime() { 
     return fieldTime; 
    } 

    public void setFieldTime(Date fieldTime) { 
     this.fieldTime = fieldTime; 
    } 
} 

类测试:类包含主

package poin; 

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.GregorianCalendar; 
import java.util.Date; 
import java.util.Calendar; 
import java.util.Iterator; 
import java.util.List; 

public class Test { 

    static Date dateDebut; 
    static Date dateFin; 

    /** 
    * @param args 
    * @throws ParseException 
    */ 
    public static void main(String[] args) throws ParseException { 
     String dateEntre = "2016-03-03"; 
     String dateF  = "2016-03-03"; 

     SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); 

     dateDebut= ft.parse(dateEntre); 
     dateFin=ft.parse(dateF); 

     // TODO Auto-generated method stub 
     DataBase obj = new DataBase(); 

     List<Join> list = new ArrayList<Join>(); 
     List<Join> result = new ArrayList<Join>(); 

     try { 
      list=obj.getCard(); 
      //iterateur pour la liste extraite de la base de donnée 
      Iterator<Join> it=result.iterator(); 

      //gregorian calendrier 
      GregorianCalendar cal = new GregorianCalendar(); 
      cal.setTime(dateDebut); 

      //dernier element de la liste: base de donnée 

      Join obj2 = list.get(list.size()-1); 

      // dernier identifiant de la carte dans la table 
      int dernId = obj2.getCardHolderId(); 
      result.add(list.get(0)); 

      while(!cal.getTime().after(dateFin)){ 

       for (Join j : list){ 
        //System.out.println(cal.getTime()); 
        //Join o = it.next(); 
        //boolean o2 = result.add(o); 

        if(j.getFieldTime().compareTo(cal.getTime())==0){ 
         //ICI LE PROBLEME (translated: HERE IS THE PROBLEM) 
         for (Join i : result){ 
          if (i.getCardHolderId() != j.getCardHolderId() && i.getFieldTime() != j.getFieldTime()) result.add(j); 
         } 
        } 
       } 

       cal.add(Calendar.DAY_OF_WEEK, 1); 
      } 

      for(Join k : list){ 
       System.out.println(k.getCardHolderId()+"  "+k.getNom()); 
      } 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
+0

请描述你的问题。 –

+0

每天,对于一个人,我需要选择他第一次登录。每个人可以有多个时间登录 –

+0

您有什么问题与第一次选择?你遗弃了很多代码(很多可能与问题无关的代码),并期望我们从中提炼出真正的问题。 –

回答

1

如果您的数据存储在关系数据库中,这是典型的最好使用SQL来获得所需的数据(而不是在代码中实现搜索逻辑)。

假设你的数据,如

 ID LAST_NAME FIRST_NAME FIELD_TIME   
---------- --------- ---------- ------------------- 
     1 A.  A.   01.01.2016 10:20:00 
     2 A.  A.   01.01.2016 12:22:00 
     3 A.  A.   03.01.2016 08:50:00 
     4 B.  B.   01.01.2016 15:08:00 

要获得每个用户的第一个日志,每天你必须让这一天从datetime列(我用TRUNC这在Oracle工作 - 适应你的数据库,如果必需),并根据用户和日期计算日志时间为MIN

select 
    LAST_NAME, FIRST_NAME, trunc(FIELD_TIME) log_day, min(FIELD_TIME) FIRST_LOG 
from 
    log_time 
group by 
    LAST_NAME, FIRST_NAME, trunc(FIELD_TIME) 
order by 
    1, 2, 3; 

结果是准确的预期,简单读取光标获取数据

LAST_NAME FIRST_NAME LOG_DAY    FIRST_LOG   
--------- ---------- ------------------- ------------------- 
A.  A.   01.01.2016 00:00:00 01.01.2016 10:20:00 
A.  A.   03.01.2016 00:00:00 03.01.2016 08:50:00 
B.  B.   01.01.2016 00:00:00 01.01.2016 15:08:00 
+0

我使用SQL Server –

+0

您可以将它适应于SQL Server –

+0

@Med这是您应该单独完成的基本作业。有点提示:你可以谷歌上的“sqlserver提取日期时间”。解决方案[here](http://stackoverflow.com/questions/113045/how-to-return-the-date-part-only-from-a-sql-server-datetime-datatype) –