Sqlite 并在日期之间设置它,格式正确但仍然无法正常工作
Sqlite and setting it between dates, Format Correct but still not working
所以我试图让一个基本的 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 对其进行格式化,但是当我 运行 函数时,table 不显示任何内容。我将日期设置得很宽(2018 年 2 月 1 日到 2018 年 2 月 14 日),我数据库中的日期是 2018 年 2 月 7 日。我在数据库中有一些记录可以提取。但是,它只是不这样做。而且没有弹出错误,所以我不知道为什么它不起作用。
Image of the records that I'm trying to place into my jtable
Edit1: 在我忘记之前,我也尝试了以下 SQL string
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+"' ";
注意列名两边的方括号(不是单引号)。这与需要 date/time 值无关,这是因为列名中有空格。任何带有空格的列名都必须用双引号或方括号括起来。这就是为什么最好不要在列名中使用空格。
如果它们实际上存储为 'YYYY-MM-DD' 字符串,那么您的替代方案不起作用的原因是因为您用单引号引用了列名 'Report Transaction Date'
,这导致比较日期值的文字字符串。
所以我试图让一个基本的 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 对其进行格式化,但是当我 运行 函数时,table 不显示任何内容。我将日期设置得很宽(2018 年 2 月 1 日到 2018 年 2 月 14 日),我数据库中的日期是 2018 年 2 月 7 日。我在数据库中有一些记录可以提取。但是,它只是不这样做。而且没有弹出错误,所以我不知道为什么它不起作用。
Image of the records that I'm trying to place into my jtable
Edit1: 在我忘记之前,我也尝试了以下 SQL string
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+"' ";
注意列名两边的方括号(不是单引号)。这与需要 date/time 值无关,这是因为列名中有空格。任何带有空格的列名都必须用双引号或方括号括起来。这就是为什么最好不要在列名中使用空格。
如果它们实际上存储为 'YYYY-MM-DD' 字符串,那么您的替代方案不起作用的原因是因为您用单引号引用了列名 'Report Transaction Date'
,这导致比较日期值的文字字符串。