views:

95

answers:

1

For a column of type varchar I could write such a query:

public IList<Order> GetByName(string orderName)
{
 using (ISession session = NHibernateHelper.OpenSession())
 {
  return session.CreateCriteria<Order>().
   Add(Restrictions.Like("Name", string.Format("%{0}%", orderName))).
   List<Order>();
 }
}

How do I write a similar LIKE-query for a column that has type datetime? Somehow:

public IList<Order> GetByDateTime(string str)
{
    using (ISession session = NHibernateHelper.OpenSession())
    {
        return session.CreateCriteria<Order>()
            .Add(Restrictions.Like(Projections.Cast(NHibernateUtil.String, Projections.Property("Created")),
                                    '%' + str + '%'))
            .List<Order>();
    }
}

That is, if the method is passed the date and part-time (eg "25.03.2010 19"), then displays all orders are carried out in this period of time:
25.03.2010 19:22:00
25.03.2010 19:44:00
25.03.2010 19:59:00

+2  A: 

Just check if the date is within your desired range:

DateTime beginDate = new DateTime(2010, 3, 25, 19, 0, 0);
DateTime endDate = new DateTime(2010, 3, 25, 20, 0, 0);
return session.CreateCriteria<Order>()
   .Add(Expression.Between("OrderDate", beginDate, endDate))
   .List<Order>();
Aaronaught
Your response is understandable and logical. But ...The user specifies only the date string like "14.04.2010", "2010", "14.04", "04.2010 22:06", etc.
Anry
@Anry: If `2010` and `14.04` are both valid inputs, how are you disambiguating? `14.04` might mean April 14th, or might mean April 2014. Or it might mean 2:04 PM. What if the input is just `10`, should that be interpreted as 2010 or October? The easiest solution would be to ask the user for a date range instead of an arbitrary text input. The more user-friendly, but exponentially more difficult solution is to parse the fuzzy date into a usable range using date arithmetic and possibly a few regular expressions.
Aaronaught