1

私はhibernateを使用してJavaSwingアプリケーションに取り組んでいます。年の四半期ごとのjasperreportの結果に表示したい(データベースの日付があるので、データベースにあるこれらの日付に対応する年を抽出します)いくつかの解決策を見つけましたが、それは本当に良いものではないと思います、それが簡単な方法です。

select * from dbcheques.Cheque
where YEAR(dateEncaissement) = '2013'
and (MONTH(dateEncaissement) = 7
or MONTH(dateEncaissement) = 8 or MONTH(dateEncaissement) >= 9) 

これにより、その年の第3四半期が返されます。他の四半期とほぼ同じクエリで、数値が変わるだけです。

第1四半期

and (MONTH(dateEncaissement) = 1 or MONTH(dateEncaissement) = 2
or MONTH(dateEncaissement) >= 3) 

第2四半期

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>

各行の4分の1を含め、テーブルから行を選択する場合は、select句で同じトリックを使用します。

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

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

JBNizetの回答は正解です。

もう1つのオプションは、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ドライバーがJDBC4.2以降に準拠している場合は、オブジェクトのメソッドLocalDateを介してオブジェクトを渡すことができる場合があります。PreparedStatementsetObject

java.sql.Dateそうでない場合は、クラスの使用にフォールバックします。古いクラスに追加された新しいメソッドは、変換を容易にします。

java.sql.Date d = java.sql.Date.valueOf( firstDay );
于 2016-09-07T05:54:15.317 に答える