我正在使用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)
这是一个接口:
发布于 2013-03-15 04:30:54
如果您的问题是“如何获得给定季度(1、2、3或4)的值”,则只需使用
where ((MONTH(dateEncaissement) - 1) DIV 3) + 1 = <quarter>
如果您想从表中选择行,包括每行的四分之一,那么在select子句中使用相同的技巧:
select *, (((MONTH(dateEncaissement) - 1) DIV 3) + 1) as quarter from ...
发布于 2016-09-06 21:54:15
tl;dr
查询当前季度:
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 );
java.time
JB Nizet的答复是正确的。
另一个选项是使用java.time类及其扩展三次-额外项目来确定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驱动程序符合JDBC4.2及更高版本,则可以通过LocalDate
对象的setObject
方法传递该setObject
对象。
如果不是,请回到使用java.sql.Date
类。添加到旧类中的新方法便于转换。
java.sql.Date d = java.sql.Date.valueOf( firstDay );
https://stackoverflow.com/questions/15432309
复制