簡體   English   中英

Java:如何將LocalDate與sqlite數據庫中存儲的日期進行比較?

[英]Java :How to compare LocalDate with date storing in sqlite database?

我正在嘗試比較SQLite數據庫中存儲的LocalDate和日期。我使用SqliteStudio創建我的表,當我使用SQL 開發人員時,一切都很好,但是由於某些原因,我將數據庫更改為SQLite ,我發現沒有問題檢測任何錯誤,因為 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));

DAO類

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;

}

localDate有這個格式:2017/09/25

Dpayment數據庫具有以下格式:1506290400000

不確定你的意思是你在 Sqlite 中有日期類型。 您存儲為 TEXT、REAL 或 INT 並且這些都不支持毫秒。

你有幾個選擇。

1) 反轉邏輯以將 DPayment 重新格式化為 Java 格式

暫時忘記Java代碼,外部連接數據庫。 玩弄這個查詢。 這也做從毫秒到秒的轉換

SELECT strftime('%Y/%m/%d', DPayment / 1000) FROM EMPLOYER 

2) 更改您的數據庫以使用支持的 YYYY-MM-DD 日期格式,並相應地更新 Java 代碼

3)讓您的 Java 代碼在查詢中使用(毫秒)秒而不是格式化的日期字符串

您可以讓 SQLite 計算當前日期:

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

這解決了連接字符串的問題,並且更容易閱讀,但有一些警告:您不能將任何日期傳遞給FindPaiment ,並且它不會將您的客戶端日期與服務器日期進行比較。 如果這些警告對您不起作用,您可以使用 SQLite 的日期函數之一 ( https://sqlite.org/lang_datefunc.html )。

當我創建我的表時,我使用了 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。所以根據Convert LocalDate to LocalDateTime or java.sql .Timestamp它應該將本地日期轉換為日期並從日期中獲取時間(長格式)並進行比較。

        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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM