所以我正在尝试让一个基本的 sql 字符串工作,它将根据日期之间的时间抓取 sqlite 数据库中的记录。但是,由于某种原因,它不起作用。我只是不明白为什么。
private void viewTransactionsBetweenDatesTable(){
//Sets the table to view transactions between certain dates
try{
//Get's the dates from startDateChooserTransactions1 and endDateChooserTransactions1
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
DateFormat df2 = new SimpleDateFormat("MMM dd, yyyy");
Date sdct = startDateChooserTransactions1.getDate();
Date edct = endDateChooserTransactions1.getDate();
String sdcts = df.format(sdct);
String edcts = df.format(edct);
String sdctlabel = df2.format(sdct);
String edctlabel = df2.format(edct);
//Child's ID
String cid = childIDCheck1.getText();
//Grab's the specified data and places that as the table
String sql = "SELECT * FROM ChildrenPayment WHERE ChildID='"+cid+"' AND strftime('%Y-%m-%d', 'Report Transaction Date') BETWEEN '"+sdcts+"' AND '"+edcts+"' ";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
//Sets up the table
Info1.setModel(DbUtils.resultSetToTableModel(rs));
TableColumnModel tcm = Info1.getColumnModel();
//tcm.removeColumn(tcm.getColumn(3));
// tcm.removeColumn(tcm.getColumn(3));
// tcm.removeColumn(tcm.getColumn(10));
// tcm.moveColumn(11, 10);
// tcm.removeColum(tcm.getColumn(13));
//Changes modLabel1
modLabel1.setText(firstNameEditClass1.getText() + " " + lastNameEditClass1.getText() + " Between " + sdctlabel + " - " + edctlabel);
}catch(Exception e){
JOptionPane.showMessageDialog(null, e);
}finally{
try{
pst.close();
rs.close();
}catch(Exception e){
JOptionPane.showMessageDialog(null, e);
}
}
}
我正在使用jdatechooser,所以与更好的DateTimeFormatter相比,我被迫使用SimpleDateFormat。无论如何,我像 sqlite 喜欢的那样根据 YYYY-MM-DD 对其进行格式化,但是当我运行该函数时,表格不显示任何内容。我设置了相当宽的日期(2018 年 2 月 1 日至 2018 年 2 月 14 日),数据库中的日期是 2018 年 2 月 7 日。我在数据库中有一些记录供它提取。但是,它只是不这样做。并且没有弹出任何错误,所以我不知道为什么它不起作用。
我试图放入我的 jtable 中的记录的图像
编辑1:在我忘记之前,我还尝试了以下SQL字符串
String sql = "SELECT * FROM ChildrenPayment WHERE ChildID='"+cid+"' AND 'Report Transaction Date' BETWEEN '"+sdcts+"' AND '"+edcts+"' ";
这不起作用:
strftime('%Y-%m-%d', 'Report Transaction Date')
因为您提供的格式说明符要求您提供三个值,分别表示年、月和日。
如果数据库中的日期存储为完整的 SQLite 日期时间字符串,则必须使用
"... date([Report Transaction Date]) BETWEEN '"+sdcts+"' AND '"+edcts+"' ";
请注意列名两边的方括号(不是单引号)。这与需要日期/时间值无关,这是因为列名中包含空格。任何带空格的列名都必须括在双引号或方括号中。这就是为什么永远不要在列名中使用空格是个好主意的原因。
如果它们实际上存储为"YYYY-MM-DD"字符串,那么您的替代方法不起作用的原因是您将列名'Report Transaction Date'
单引号,这会导致将该文本字符串与日期值进行比较。