Oracleでは、フォーマットの日付があります
2011年4月17日19:20:23.707000000
17-04-2011のすべての注文を取得したいと思います。
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
String myDate = "17-04-2011";
Date date = formatter.parse(myDate);
Criteria criteria =
session.createCriteria(Order.class);
Criterion restrictDate = Restrictions.like("orderDate",date);
しかし、それは私に空の結果をもたらします:
なぜ_Restrictions.like(...
_)を使用するのですか?
Restrictions.eq(...)
を使用する必要があります。
比較演算子として日付オブジェクトで_.le
_、_.lt
_、_.ge
_、_.gt
_を使用することもできます。 LIKE
演算子は、列の部分的な内容に従って結果を一致させたい場合にLIKE
が役立つため、この場合には適切ではありません。 http://www.sql-tutorial.net/SQL-LIKE.asp を参照してください。
たとえば、一部の人々のフルネームを持つ名前列がある場合、_where name like 'robert %'
_を実行して、_'robert '
_で始まる名前を持つすべてのエントリを返すことができます(_%
_は任意の文字を置換できます)。
あなたの場合、あなたはあなたがマッチしようとしている日付の完全な内容を知っているので、LIKE
ではなく平等を使うべきです。この場合、Hibernateは例外を提供しませんが、とにかくRestrictions.eq(...)
でも同じ問題が発生するでしょう。
コードで取得した日付オブジェクト:
_SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
String myDate = "17-04-2011";
Date date = formatter.parse(myDate);
_
この日付オブジェクトは、2011年4月17日0時、0分、0秒、0ナノ秒に相当します。
つまり、データベース内のエントリには、その日付が正確にある必要があります。つまり、データベースエントリの日付が「17-April-2011 19:20:23.707000000」の場合、「17-April-2011 00:00: 00.0000000000」。
特定の日からデータベースのすべてのエントリを取得する場合は、次のコードを使用する必要があります。
_ SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
String myDate = "17-04-2011";
// Create date 17-04-2011 - 00h00
Date minDate = formatter.parse(myDate);
// Create date 18-04-2011 - 00h00
// -> We take the 1st date and add it 1 day in millisecond thanks to a useful and not so known class
Date maxDate = new Date(minDate.getTime() + TimeUnit.DAYS.toMillis(1));
Conjunction and = Restrictions.conjunction();
// The order date must be >= 17-04-2011 - 00h00
and.add( Restrictions.ge("orderDate", minDate) );
// And the order date must be < 18-04-2011 - 00h00
and.add( Restrictions.lt("orderDate", maxDate) );
_
この方法を使用すると、選択したレコードのリストを取得できます。
_GregorianCalendar gregorianCalendar = new GregorianCalendar();
Criteria cri = session.createCriteria(ProjectActivities.class);
cri.add(Restrictions.ge("EffectiveFrom", gregorianCalendar.getTime()));
List list = cri.list();
_
すべてのレコードは、「2012年10月8日」以上のリストに生成されるか、取得の基準の制限(gregorianCalendar.getTime()
)の2番目のパラメーターでユーザー受け入れ日の日付を渡します。記録。
列がタイムスタンプの場合、次のことができます。
if(fromDate!=null){
criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) >= TO_DATE('" + dataFrom + "','dd/mm/yyyy')"));
}
if(toDate!=null){
criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) <= TO_DATE('" + dataTo + "','dd/mm/yyyy')"));
}
resultDB = criteria.list();
これを試して、
String dateStr = "17-April-2011 19:20:23.707000000 ";
Date dateForm = new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss").parse(dateStr);
SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
String newDate = format.format(dateForm);
Calendar today = Calendar.getInstance();
Date fromDate = format.parse(newDate);
today.setTime(fromDate);
today.add(Calendar.DAY_OF_YEAR, 1);
Date toDate= new SimpleDateFormat("dd-MM-yyyy").parse(format.format(today.getTime()));
Criteria crit = sessionFactory.getCurrentSession().createCriteria(Model.class);
crit.add(Restrictions.ge("dateFieldName", fromDate));
crit.add(Restrictions.le("dateFieldName", toDate));
return crit.list();