代码之家  ›  专栏  ›  技术社区  ›  Darin Dimitrov

在HQL查询的“where”子句中使用日期

  •  3
  • Darin Dimitrov  · 技术社区  · 17 年前

    我正在使用 SQLite

    public class Project
    {
        public virtual int Id { get; set; }
        public virtual DateTime StartDate { get; set; }
    }
    

    映射到数据库中此表的:

    CREATE TABLE projects (
        id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
        start_date DATETIME
    )
    

    现在,我需要编写一个查询,该查询将选择给定月份内开始的所有项目。

    在SQL中,我可以使用:

    SELECT id FROM projects WHERE strftime('%m', start_date) = '12'
    

    我不喜欢这个查询,因为它使用了特定于数据库的函数“ strftime ".

    // Get all projects that started in December (no matter which year)
    var projects = session
        .CreateQuery(
            "from Project p " +
            "where strftime('%m', p.StartDate) = :month")
        .SetParameter("month", "12")
        .List<Project>();
    

    我也尝试过“从项目p开始,其中p.StartDate.Month=12”,但没有成功。

    3 回复  |  直到 17 年前
        1
  •  4
  •   kÍ©eÍ£mÍ®pÍ¥ Í©    17 年前

    如果您定期查询月、日、年,那么您不应该将日期存储为DateTime列—这会使查询效率极低。您可以很容易地创建一个“月”列并对其进行查询(您的DBA会再次喜欢您)

        2
  •  1
  •   Stefan Steinegger    17 年前

    我强烈建议您编写一个自定义函数。

    http://ayende.com/Blog/archive/2006/10/01/UsingSQLFunctionsInNHibernate.aspx

    我不是指sql函数,我是指用RegisterFunction注册以增强NHibernate方言的NHibernate函数。

    另一个可能更好的例子: http://ayende.com/Blog/archive/2007/04/27/Paged-data--Count-with-NHibernate-The-really-easy-way.aspx

        3
  •  -1
  •   david valentine    17 年前