[英]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,如下所示:
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.