如何在PostgreSQL中获取上周数据?C#日期筛选默认值不生效问题
问题:日期筛选默认值不生效,上周数据范围无法正确过滤
我有两个用于捕获startDate和endDate的输入框,已经给它们设置了默认日期,但输出结果并没有反映这个默认值。
场景示例:假设今天是2022-11-09,我希望输出上周的数据,也就是时间范围为2022-10-31至2022-11-06。
我查过类似问题但没找到合适的方案,尝试写了下面的代码,但默认分支的逻辑没法正常工作:
var customFilter = filter.CustomFilter; if (customFilter is { StartDate: { }, EndDate: { } }) { var startDate = customFilter.StartDate.Value.Date; var endDate = customFilter.EndDate.Value.Date; Truck = (customFilter.StartDate.HasValue && customFilter.EndDate.HasValue) ? Truck.Where(c => c.TransactionStartDate >= startDate && c.TransactionStartDate <= endDate) : Truck.Where(c => c.TransactionStartDate == startDate.Subtract(1, "week").StartOf("isoweek") && c.TransactionEndDate == endDate.Subtract(1, "week").StartOf("isoweek")); }
修复方案
问题根源
- 条件判断冗余导致默认分支不执行:外层
if (customFilter is { StartDate: { }, EndDate: { } })已经确保了StartDate和EndDate都有值,所以内部的三元判断永远只会走true分支,默认逻辑根本没机会运行。 - 默认日期计算与筛选逻辑错误:
startDate.Subtract(1, "week")不是C#的标准写法,而且默认分支用的是精确匹配(==),不是范围筛选,自然拿不到上周的所有数据。
修复后的代码
var customFilter = filter.CustomFilter; // 提前计算默认的上周时间范围(以周一为一周起始,可根据需求调整) var today = DateTime.Today; // 计算上周一起始:今天减去当前星期几的天数,再减6天 var lastWeekStart = today.AddDays(-(int)today.DayOfWeek - 6).Date; var lastWeekEnd = lastWeekStart.AddDays(6).Date; // 直接判断是否有自定义日期输入 if (customFilter.StartDate.HasValue && customFilter.EndDate.HasValue) { var startDate = customFilter.StartDate.Value.Date; var endDate = customFilter.EndDate.Value.Date; Truck = Truck.Where(c => c.TransactionStartDate >= startDate && c.TransactionStartDate <= endDate); } else { // 使用默认上周范围进行筛选 Truck = Truck.Where(c => c.TransactionStartDate >= lastWeekStart && c.TransactionStartDate <= lastWeekEnd); }
额外说明
如果需要严格按照ISO标准周(周一为一周第一天,每年第1周包含1月4日)计算,可改用ISOWeek类(.NET Core 3.0+支持):
var today = DateTime.Today; var currentYear = ISOWeek.GetYear(today); var currentWeek = ISOWeek.GetWeekOfYear(today); var lastWeekNumber = currentWeek == 1 ? 52 : currentWeek - 1; var lastWeekYear = currentWeek == 1 ? currentYear - 1 : currentYear; var lastWeekStart = ISOWeek.ToDateTime(lastWeekYear, lastWeekNumber, DayOfWeek.Monday); var lastWeekEnd = lastWeekStart.AddDays(6).Date;
内容的提问来源于stack exchange,提问作者iamme
相关产品推荐
相关产品推荐

