Java 如果我想查看从“2016-11-31”到“2016-11-31”的WeeklyTestTable,它会给我错误,因为2016年11月只有30天

Java 如果我想查看从“2016-11-31”到“2016-11-31”的WeeklyTestTable,它会给我错误,因为2016年11月只有30天,java,sql-server,Java,Sql Server,我有一个名为WeeklyTestTable的表,我必须检查特定月份(如2月至3月或1月至2月)内学生的所有详细信息。问题是,如果我想检查WeeklyTestTable从“2016-11-31”到“2016-11-31”,则在从字符串转换日期和/或时间时给我的转换失败,因为11月2016年只有30天。就像这样,如果我从“2016-08-31”检查到“2016-09-31”,它给出的错误与9月份只有30天的错误相同。问题是我不能更改日期,日期必须在月份之间相同。那么sql中是否有任何选项可以舍入日期

我有一个名为WeeklyTestTable的表,我必须检查特定月份(如2月至3月或1月至2月)内学生的所有详细信息。问题是,如果我想检查WeeklyTestTable从“2016-11-31”到“2016-11-31”,则在从字符串转换日期和/或时间时给我的转换失败,因为11月2016年只有30天。就像这样,如果我从“2016-08-31”检查到“2016-09-31”,它给出的错误与9月份只有30天的错误相同。问题是我不能更改日期,日期必须在月份之间相同。那么sql中是否有任何选项可以舍入日期,这样我就可以得到所需的结果。我将sql与java结合使用,因此如果java中有一个选项可以告诉我某个月只有30、31、29或28天,那么我可以在发送到sql服务器之前更改日期

编辑: 事实上,我的表格中有每个学生的考试信息,我想检查他/她在某个月内通过的考试数量,这还取决于他/她何时进入该机构。例如,假设一个人于2016年8月31日在该机构注册。如果我想在9月份检查他的考试,那么我将从上个月的“8月”和他的入学日期“31日”开始,因此我的查询将是“从表中选择*,其中rollno=something和class=something,日期介于“2016-08-31”和“2016-09-31”之间,但由于9月份没有31日,因此我的查询是给出了上述错误。 在数据库中,date的数据类型是date,我发送如下字符串:

try {                              

ps = con.prepareStatement("select COUNT(Marks) as testPassed from WeeklyTestTable where (Date_of_Entry between '"+another_fee.sprevious_year+"-"+another_fee.sprevious_month+"-"+another_fee.sprevious_date+"' and '"+another_fee.scurrent_year+"-"+another_fee.scurrent_month+"-"+another_fee.scurrent_date+"') and Roll_No="+student_info[i][0]+" and Class='"+student_info[i][3]+"' and(Marks >= 5)");
                    rs = ps.executeQuery();
                    while (rs.next()) {
                    test_info[i] = rs.getInt(1);               
                    }
其中,前一日期=当前日期

请原谅我的英语

Java8解决方案 返回

返回月份中的整数天数

前Java8解决方案
如果您有一个开始日期,并且希望为即将到来的月份指定相应的日期,即月份的同一天,那么只需使用。如果太大,它将自动调整到月的最后一天:

此方法分三步将指定金额添加到“月份”字段:

将输入月份添加到“年度月份”字段 检查结果日期是否无效 如有必要,将月份日期调整为最后一个有效日期 范例

//使用循环 私有静态列表getDatesLocalDate firstDate,整数计数{ 列表日期=新数组列表; 对于int i=0;i firstDate.plusMonthsi .toList; } 试验

System.out.printlngetDatesLocalDate.of2016,3,11,6; System.out.printlngetDatesLocalDate.of2016,1,31,6; 输出

[2016-03-11, 2016-04-11, 2016-05-11, 2016-06-11, 2016-07-11, 2016-08-11, 2016-09-11] [2016-01-31, 2016-02-29, 2016-03-31, 2016-04-30, 2016-05-31, 2016-06-30, 2016-07-31]
注意:用2016年来表示它是闰年。

你从哪里得到日期的?2016年11月31日你是如何结束的?显示代码。2016年11月只有30天-2016年在这里没有什么不寻常的地方…请更具体一些,将代码从起始日期参数发布到您发送SQL查询的位置。如果我们不知道您的开始日期是以长、日期、LocalDateTime对象还是字符串的形式传递的,那么就不可能告诉您实现所需目标的最简单或最简洁的方法。了解数据库中存储日期的特定列所使用的数据类型也很重要。请您指导我如何在java中添加LocalDate包。事实上,我是java新手,因此我很难使用javadoc和oracle网站。我也在使用jdk 7,我认为localdate在jdk 7中不可用,所以有其他选择。添加了jdk 7兼容解决方案。它基本上是在下个月的第一天运行,然后在一天之前返回。我使用的是jdk 7,我认为localdate在jdk 7中不可用,所以是否有其他选择。@Moheb一种方法是获得。
public static int lengthOfMonth(int year, int month) {
    GregorianCalendar c = new GregorianCalendar(year, month - 1, 1);
    c.add(Calendar.MONTH, 1);
    c.add(Calendar.DAY_OF_MONTH, -1);
    return c.get(Calendar.DAY_OF_MONTH);
}