You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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"));
}

修复方案

问题根源

  1. 条件判断冗余导致默认分支不执行:外层if (customFilter is { StartDate: { }, EndDate: { } })已经确保了StartDate和EndDate都有值,所以内部的三元判断永远只会走true分支,默认逻辑根本没机会运行。
  2. 默认日期计算与筛选逻辑错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:50:38