【问题标题】:SQL java Select all the records that added in this monthSQL java 选择本月添加的所有记录
【发布时间】:2019-09-02 12:54:12
【问题描述】:

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

【问题讨论】:

  • Mysql 和 sqlite 不一样,所以 \i 从你的标签中删除了它。
  • 在您的问题中,您提到了created_atStart 列,并且在您的代码中,您有一个列End。说明你需要什么。
  • 我的错。代码错了,应该是Start。
  • 我记得 SQLite 没有date 数据类型吗?所以你需要像SELECT Firstname FROM Members_Tbl WHERE End like 'April % 2019';这样的查询?我建议您将日期字符串存储为 ISO 8601 格式 (yyyy-mm-dd)。它还可能使您的查询更简单。

标签: java sqlite


【解决方案1】:

您可以使用(见下文)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 个字符(例如 2019 年 1 月 9 日),则上述内容将无法正常工作。

推荐的方法是以 YYYY-MM-DD 格式(或链接中的任何时间字符串格式)存储日期。然后您可以使用SQLite DateTime 函数。

【讨论】:

    【解决方案2】:

    如果您想比较月份,您的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】:

      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 日期和时间 API java.time。使用起来感觉好多了。

      链接

      【讨论】:

        【解决方案4】:

        String sql = "select * from Members_Tbl WHERE strftime('%m', Start) == strftime('%m', 'now')";

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

        【讨论】:

        • 这个查询会给你错误的结果:如果你今天执行它,你会得到 2019 年 4 月、2018 年 4 月、.. 每年四月的所有行。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 2011-07-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多