1

我正在使用 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)  

这是界面:

!(http://hpics.li/7ca6010

4

2 回答 2

1

如果您的问题是“如何获取给定季度(1、2、3 或 4)的值”,那么您可以简单地使用

where ((MONTH(dateEncaissement) - 1) DIV 3) + 1 = <quarter>

如果要从表中选择行,包括每行的四分之一,则在 select 子句中使用相同的技巧:

select *, (((MONTH(dateEncaissement) - 1) DIV 3) + 1) as quarter from ...
于 2013-03-15T12:30:54.233 回答
0

tl;博士

查询当前季度:

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 类及其扩展,即ThreeTen-Extra项目来确定 Java 中的日期。该项目添加了类QuarterYearQuarter.

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 );
于 2016-09-07T05:54:15.317 回答