Java:如何将LocalDate与sqlite数据库中存储的日期进行比较?

Java:如何将LocalDate与sqlite数据库中存储的日期进行比较?,java,sqlite,date,Java,Sqlite,Date,我试图比较和数据库中存储的日期。我使用创建表时,使用的一切都很好,但由于某些原因,我将数据库更改为,我发现了问题,但没有检测到任何错误,因为sqlite studio将日期保存为毫秒 那么,如何将2017/09/25与1511906400000进行比较 代码 控制器类 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd"); LocalDate localDate = LocalDate.now();

我试图比较和数据库中存储的日期。我使用创建表时,使用的一切都很好,但由于某些原因,我将数据库更改为,我发现了问题,但没有检测到任何错误,因为sqlite studio将日期保存为毫秒

那么,如何将2017/09/25与1511906400000进行比较

代码
控制器类

  DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        LocalDate localDate = LocalDate.now();
        String date=dtf.format(localDate);
        System.out.println(date); //print 2017/09/24
        /*now i will compare this date to saved date in database*/
        Paiments = new EMPDao().FindPaiment(dtf.format(localDate));
刀类

public ObservableList<Employer> FindPaiment(String format) {

    Employer employer;

    ObservableList<Employer> employers = FXCollections.observableArrayList();

    String querySelectEmployer = "SElECT * FROM EMPLOYER WHERE DPayment =" + "'" + format + "'" + " and STAT is null";

    try {

        ResultSet resultSet = Dbaconnection.getConnection().createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY).executeQuery(querySelectEmployer);

        while (resultSet.next()) {

            employer = new Employer(resultSet.getString("NFILE"), resultSet.getString("FNAME"), resultSet.getString("LNAME"), resultSet.getDate("BDATE"), resultSet.getString("PDATE"), resultSet.getString("NPHONE"), resultSet.getString("CCP"), resultSet.getDate("EDATE"), resultSet.getDate("SDATE"), resultSet.getString("POSTE"), resultSet.getString("CATEGORY"), resultSet.getString("NUMEROSS"), resultSet.getString("PAYMENT"), resultSet.getString("ETAT"), resultSet.getDate("DPAYMENT"), null);
            employers.add(employer);
        }
        resultSet.close();

    } catch (SQLException ex) {
        ex.printStackTrace();
    }

    return employers;

}
公共ObservableList FindPaiment(字符串格式){
雇主;
ObservableList=FXCollections.observableArrayList();
字符串querySelectEmployer=“从雇主选择*,其中DPayment=“+””“+格式+”“+”且STAT为空”;
试一试{
ResultSet ResultSet=Dbaconnection.getConnection().createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
while(resultSet.next()){
雇主=新雇主(resultSet.getString(“NFILE”)、resultSet.getString(“FNAME”)、resultSet.getString(“LNAME”)、resultSet.getDate(“BDATE”)、resultSet.getString(“PDATE”)、resultSet.getString(“NPHONE”)、resultSet.getString(“CCP”)、resultSet.getDate(“EDATE”)、resultSet.getDate(“SDATE”)、resultSet.getString(“POSTE”)、resultSet.getString(“类别”),resultSet.getString(“NUMEROSS”),resultSet.getString(“付款”),resultSet.getString(“ETAT”),resultSet.getDate(“DPAYMENT”),null;
雇主。添加(雇主);
}
resultSet.close();
}catch(SQLException-ex){
例如printStackTrace();
}
返回雇主;
}
localDate
的格式为:2017/09/25


Dpayment
数据库中的格式为:1506290400000

您可以让SQLite计算当前日期:

String querySelectEmployer = "SELECT * FROM EMPLOYER WHERE DPayment = date('now') and STAT is null";

这解决了串接字符串的问题,并且更易于阅读,但附带了一些警告:您不能将任何日期传递给
FindPaiment
,并且它不会将客户端的日期与服务器的日期进行比较。如果这些警告不适用于您,您可以使用SQLite的日期函数()。

不确定您在SQLite中使用日期类型是什么意思。这些都不支持毫秒

你有几个选择

1) 颠倒逻辑,将付款格式重新设置为Java格式

暂时忘记Java代码,从外部连接到数据库。处理这个查询。这也会将毫秒转换为秒

SELECT strftime('%Y/%m/%d', DPayment / 1000) FROM EMPLOYER 
2) 将数据库更改为使用支持的日期格式YYYY-MM-DD,并相应地更新Java代码


3) 让Java代码在查询中使用(毫秒)秒,而不是格式化的日期字符串

当我创建表时,我使用了sqlite studio 3.3.1,如下所示:

这就是DDL

CREATE TABLE EMPLOYER (
    NFILE    VARCHAR2 (20) PRIMARY KEY,
    FNAME    VARCHAR2 (20),
    LNAME    VARCHAR2 (20),
    BDATE    DATE,
    PDATE    VARCHAR2 (20),
    NPHONE   VARCHAR2 (20),
    CCP      VARCHAR2 (20),
    EDATE    DATE,
    POSTE    VARCHAR2 (20),
    CATEGORY VARCHAR2 (20),
    PAYMENT  VARCHAR2 (20),
    DPAYMENT DATE,
    ETAT     VARCHAR2 (20),
    NUMEROSS VARCHAR2 (20),
    SDATE    DATE,
    IMAGE    BLOB,
    STAT     VARCHAR2 (20) 
);
因为sqlite 3.3.1没有“YYYY-MM-DD”格式的日期类型,并且它在sqlite上存储的数据很长,例如2017-09-26=1506376800000。因此,它应该将localdate转换为日期,从日期获取时间(长格式),并进行比较

        LocalDate localDate = LocalDate.now();
        long currentDate=String.valueOf(java.sql.Date.valueOf(localDate).getTime());
        //Pass the paramater as long (12366332) not as date(2017/09/26)
        Paiments = new EMPDao().FindPaiment(currentDate);

建议:使用预先准备好的报表。我想不出有什么好的理由连接成SQL查询顺便说一下,Sqlite没有“日期类型”@cricket_007,但在sqlite中,我没有这种YYYY-MM-DD格式,因为它将日期保存为毫秒。是的,我使用sqlite studio,我再次输入了
Date
DateTime
@MenaiAlaEddine,正如其他人所指出的那样:在sqlite数据库中没有
Date
DateTime
列。引用:SQLite没有为存储日期和/或时间而预留的存储类。对于更严重的需求,请使用另一种解决方案,例如。@BasilBourque,您是对的,当[display
Date
Date-time
的GUI时,我认为它是
Date
类型,但实际上它是
int
。非常感谢。Sqlite确实有这种格式。您只需要过度使用
strftime()
要使用该格式,我真的不认为您实际使用的是sqlite。您可以清楚地阅读文档,看到DATE和VARCHAR2不是现有的类型。换句话说,是的。GUI提供了选项,但实际上它在数据库内部是一个实/TEXT/INT值