【问题标题】:Query with date ranges查询日期范围
【发布时间】:2013-02-26 18:55:21
【问题描述】:

我想知道如何在这个例子中进行查询:

我有一个包含 UserID、UserName、DateRegistered 和角色的用户表。 我想通过选定的两个组合框进行查询,每个组合都有: -期间注册用户(当月,上月,当前15天,最近15天,今年和去年) -角色(不同的角色)

我想在网格中显示使用所选combobox 项目引用的结果查询。 例如:用户在过去 15 天内向状态管理员注册。

我知道该怎么做,但我想做一些一般性的事情,而不是根据期间进行太多查询。 我使用 EntityFramework。

这不是代码只是我认为应该是的示例,因为我不知道转换句点以及如何比较以防万一不是当前的过去 15 天。

    string period = dropDownList.SelectedValue.ToString();
    DateTime StarPeriode= new DateTime();
    switch (option.ToUpper())
    {
        case "0":
            // CURRENT 15 days
            StarPeriode = DateTime.Now.Subtract(-15);
            break;
        case "1":
            // LAST 15 days
            StarPeriode = DateTime.Now.Subtract(-30);
            break;
        case "2":
            // CURRENT MONTH
            break;
        case "3":
            // LAST MONTH
            break;
        case "4":
            // CURRENT YEAR
            break;
        case "5":
            // LAST YEAR
            break;
        default:
            break;
    }



    var _db = new Project.Models.UserContext();
    IQueryable<User> query = _db.User.GetUser;

    query = query.Where(p => p.User.RegisterDate <= StarPeriode ||        p.User.RegisterDate>DateTime.Now);

【问题讨论】:

  • 先显示一些你已经完成的代码。谢谢
  • 线索。所有这些过滤器类别都可以重新定义为开始和结束日期。
  • 我认为角色必须换一张桌子(只是一个建议)
  • User 表只是一个例子。我只是对如何使用期间构建 linq 查询有些疑问,因为它可以是当前 15 天、15 天之前、当前月份、上个月、当年和去年。

标签: c# asp.net .net linq entity-framework


【解决方案1】:

只需在每种情况下设置一个 startDate 和 endDate 变量,然后在 LINQ 语句上使用相同的 where 子句

var startDate = DateTime.Today;
var endDate = DateTime.Today;
var now = DateTime.Today;

switch (option.ToUpper())
{
    case "0":
        // CURRENT 15 days
        startDate = now.AddDays(-15);
        endDate = now;
        break;
    case "1":
        // LAST 30 days
        startDate = now.AddDays(-30);
        endDate = now;
        break;
    case "2":
        // CURRENT MONTH
        startDate = new DateTime(now.Year, now.Month, 1);
        endDate = new DateTime(now.Year, now.Month, DateTime.DaysInMonth(now.Year, now.Month));
        break;
    case "3":
        // LAST MONTH
        var lastMonth = now.AddMonths(-1);
        startDate = new DateTime(lastMonth.Year, lastMonth.Month, 1);
        endDate = new DateTime(lastMonth.Year, lastMonth.Month, DateTime.DaysInMonth(lastMonth.Year, lastMonth.Month));
        break;
    case "4":
        // CURRENT YEAR
        startDate = new DateTime(now.Year, 1, 1);
        endDate = new  DateTime(now.Year, 12, 31);
        break;
    case "5":
        // LAST YEAR
        var lastYear = now.AddYears(-1);
        startDate = new DateTime(lastYear.Year, 1, 1);
        endDate = new  DateTime(lastYear.Year, 12, 31);
        break;
    default:
        break;
}

var users = Users.Where(u => u.RegisterDate >= startDate && u.RegisterDate <= endDate);

根据您存储 RegisterDate 值的方式,您需要注意边缘情况,因为我的示例假设所有时间部分都是上午 12:00:00。

【讨论】:

  • 是的,你是对的!!!谢谢,如果我想查看当前季度和上一季度怎么办???
  • 对于当前季度 startDate = new DateTime(now.Year, (((now.Month-1) / 3) * 3) + 1, 1); endDate = startDate.AddMonths(3).AddDays(-1);上个季度的 startDate 就是这个季度的 startDate 减去 3 个月,而 EndDate 将是相同的公式。请记住,如果您发现有用的答案,请点赞或将其标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2019-08-16
  • 2014-12-17
  • 2014-01-07
  • 2011-01-01
  • 2014-06-09
相关资源
最近更新 更多