如何获得相对于约会的四季度

时间:2013-03-15 12:19:47

标签: java hibernate

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

2 个答案:

答案 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)

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

Answer by 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 );