我需要向表格显示本月created_at的所有记录。 格式是 mmm dd yyyy, 使用 java 和 sqlite
我的数据库中有"开始"列,如果日期的月份是本月,它必须出现在表中。
我在下面尝试了这段代码,请指导我。
我需要在一个月内选择所有记录。
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_MONTH, 1);
c = Calendar.getInstance(); // reset
String today = dateFormat.format(c.getTime());
int month = c.get(Calendar.MONTH) + 1;
String sql = "SELECT Firstname FROM Members_Tbl WHERE End = '" + month
+ "'";
pst = con.prepareStatement(sql);
rs = pst.executeQuery();
monthlyreports.setModel(DbUtils.resultSetToTableModel(rs));
rs.close();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
java.time
我还没有测试过(还没有安装 SQLite(,但我相信以下内容应该有效:
DateTimeFormatter monthPatternFormatter = DateTimeFormatter.ofPattern("MMM '%' uuuu", Locale.ENGLISH);
YearMonth currentMonth = YearMonth.now(ZoneId.of("Australia/Melbourne"));
String sql = "SELECT Firstname FROM Members_Tbl WHERE Start like ?;";
pst = con.prepareStatement(sql);
String monthPattern = currentMonth.format(monthPatternFormatter);
pst.setString(1, monthPattern);
rs = pst.executeQuery();
当您说数据库中的格式是 mmm dd yyyy 时,例如 Apr 11 2019
.我假设英语月份缩写。
不过,我建议将ISO 8601标准日期字符串存储在数据库中。它就像2019-04-11
.然后,您的格式模式字符串将uuuu-MM-'%'
。或者你可以使用 <=
和 <
来比较字符串,这可能会更有效。
您使用的日期/时间类,SimpleDateFormat
和Calendar
,设计不佳,幸运的是早已过时。相反,我使用的是java.time,现代Java日期和时间API。使用起来要好得多。
链接
- Oracle 教程:日期时间解释如何使用 java.time。
- SQLite喜欢:基于模式匹配查询数据
你可以使用(见下文(SQLite substr核心函数:-
String sql = "SELECT Firstname FROM Members_Tbl WHERE substr(Start,1,2) = '" + month + "'";
但这将包括所有年份。
所以你可能想要:-
String sql = "SELECT Firstname FROM Members_Tbl WHERE substr(Start,1,2) = '" + month + "' AND substr(Start,7,4) = '" + the_respective_year + "'";
笔记
如果 MM 或 DD 并不总是 2 个字符(例如 1/9/2019(,则上述内容将无法正常工作。
建议的方法是以 YYYY-MM-DD 格式(或链接中的任何时间字符串格式(存储日期。然后,您可以使用 SQLite 日期时间函数。
字符串 sql = "从Members_Tbl中选择 * WHERE strftime('%m', Start( == strftime('%m', 'now'(";
这是我使用的查询,经过多次搜索,日期应该是 YYYY-MM-DD。谢谢大家的合作。
如果要比较月份,SimpleDateFormat
对象必须与表中存储的格式匹配。
您还必须比较年份而不仅仅是月份。
在 sql 语句中使用占位符比连接参数更安全:
SimpleDateFormat dateFormat = new SimpleDateFormat("MMM dd yyyy");
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_MONTH, 1);
c = Calendar.getInstance(); // reset
String today = dateFormat.format(c.getTime());
String sql =
"SELECT Firstname FROM Members_Tbl WHERE " +
"substr(Start, 1, 3) = ? AND substr(Start, 8, 4) = ?";
pst = con.prepareStatement(sql);
pst.setString(1, today.substring(0, 3));
pst.setString(2, today.substring(7));
rs = pst.executeQuery();
monthlyreports.setModel(DbUtils.resultSetToTableModel(rs));
rs.close();
编辑
由于您将日期的格式更改为 YYYY-MM-DD
,
您可以使用此查询:
String sql = "select * from Members_Tbl WHERE strftime('%Y-%m', Start) = strftime('%Y-%m', 'now')";