SQL Java选择本月添加的所有记录

时间:2019-04-11 19:43:47

标签: java sqlite

我需要在表中显示本月已创建的所有记录。格式为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);
    }

4 个答案:

答案 0 :(得分:1)

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-'%'。或者,您可以使用<=<比较字符串,这可能会更有效。

您使用的日期/时间类SimpleDateFormatCalendar的设计欠佳,幸运的是过时了。相反,我使用的是java.time,这是现代的Java日期和时间API。与之合作真是太好了。

链接

答案 1 :(得分:0)

您可以使用(见下文)SQLite substr core function:-

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 DateTime函数。

答案 2 :(得分:0)

要比较月份,您的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')";

答案 3 :(得分:0)

字符串sql =“从Member_Tbl中选择*,在strftime('%m',Start)== strftime('%m','now')”;

这是我使用的查询,经过几次搜索后,日期应为YYYY-MM-DD。 谢谢大家的合作。