我正在使用hibernate处理java swing应用程序。 我想在每个季度的jasperreport结果上显示(我有数据库日期,所以我将提取与我在数据库中的这些日期相对应的年份)我找到一些解决方案,但我认为这不是一个好的,这是简单的方法:
select * from dbcheques.Cheque
where YEAR(dateEncaissement) = '2013'
and (MONTH(dateEncaissement) = 7
or MONTH(dateEncaissement) = 8 or MONTH(dateEncaissement) >= 9)
将返回当年第三季度,几乎相同的查询仅针对其他季度的数字变化:
第一季度
and (MONTH(dateEncaissement) = 1 or MONTH(dateEncaissement) = 2
or MONTH(dateEncaissement) >= 3)
第二季度
and (MONTH(dateEncaissement) = 4 or MONTH(dateEncaissement) = 5
or MONTH(dateEncaissement) >= 6)
上个季度
and (MONTH(dateEncaissement) = 10 or MONTH(dateEncaissement) = 11
or MONTH(dateEncaissement) = 12)
这是界面:
答案 0 :(得分:1)
如果您的问题是“如何获取给定季度(1,2,3或4)的值”,那么您只需使用
where ((MONTH(dateEncaissement) - 1) DIV 3) + 1 = <quarter>
如果要从表中选择行,包括每行的四分之一,则在select子句中使用相同的技巧:
select *, (((MONTH(dateEncaissement) - 1) DIV 3) + 1) as quarter from ...
答案 1 :(得分:0)
查询当前季度:
String sql =
"SELECT …
FROM …
WHERE
dateCol_ >= ?
AND
dateCol_ < ?
;"
YearQuarter yq = YearQuarter.now( ZoneId.of( "America/Montreal" ) );
myPreparedStatement.setObject( 1 , yq.atDay( 1 );
myPreparedStatement.setObject( 2 , yq.plusQuarters(1).atDay( 1 );
Answer by JB Nizet是正确的。
另一种选择是使用java.time类及其扩展名ThreeTen-Extra项目确定Java中的日期。该项目添加了课程Quarter
和YearQuarter
。
YearQuarter
确定季度意味着确定日期。确定日期意味着指定时区。对于任何特定时刻,日期在全球范围内按区域变化。
ZoneId z = ZoneId.of( "America/Montreal" );
YearQuarter yq = YearQuarter.now( z );
你可以做数学,加法和减法。
YearQuarter yqNext = yq.plusQuarters( 1 );
LocalDate
您可以查询该季度的第一个和最后一个日期,以获取LocalDate
个对象。 LocalDate
类表示没有时间且没有时区的仅限日期的值。
LocalDate firstDay = yq.atDay( 1 );
LocalDate lastDay = yq.atEndOfQuarter();
通常在日期工作中更好地使用半开放式方法来定义一个时间跨度,作为包含的开头,结尾是独占。此方法用于本答案顶部的查询中。
LocalDate startOfNextQuarter = yq.plusQuarters( 1 ).atDay( 1 );
如果JDBC驱动程序符合JDBC 4.2及更高版本,则可以通过LocalDate
对象的PreparedStatement
方法传递setObject
对象。
如果没有,请回到使用java.sql.Date
课程。添加到旧类中的新方法有助于转换。
java.sql.Date d = java.sql.Date.valueOf( firstDay );