【问题标题】:Date and time between a date range in dotnetdotnet 中日期范围之间的日期和时间
【发布时间】:2022-11-02 22:31:01
【问题描述】:

我面临的问题是要知道 DateTime 是否在 dotnet 中的日期范围之间。

例如,如果 x.SchedulerStart 值为 2022-11-02 06:46:30 并且 x.SchedulerEnd 值为 2022-11-02 23:26:30。我想检查这个 DateTime.Today 值是否在日期范围内,但下面的编码不起作用。我看过这个 StackOverflow 问题仍然无法工作How to know if a DateTime is between a DateRange in C#

下面是我的编码:

x.SchedulerStart.Date >= DateTime.Today && x.SchedulerEnd.Date <= DateTime.Today

整个代码:

List<SAASMsgSchedulerForQueueList> msgSchedulerList = await _saasdbContext.SaMsgScheduler.AsNoTracking().Where(x => (x.Enabled == true && x.SchedulerStart.Date >= DateTime.Today && x.SchedulerEnd.Date <= DateTime.Today) &&
    ((x.SchedulerRecurring == "Daily" && x.RecurringTime == currentTime) || (x.SchedulerRecurring == "Weekly" && x.RecurringWeekday == weekDayNumber && x.RecurringTime == currentTime) ||
    (x.SchedulerRecurring == "Monthly" && x.RecurringDay == currentDay && x.RecurringTime == currentTime) || (x.SchedulerRecurring == "Yearly" && x.RecurringMonth == currentMonth && x.RecurringTime == currentTime)))
    .Join(_saasdbContext.TnMsgTemplate.AsNoTracking(),
    schedule => schedule.TemplateId,
    template => template.Id,
    (schedule, template) => new { schedule, template })
    .Join(_saasdbContext.SaMsgQuery.AsNoTracking(),
    schedule => schedule.template.QueryId,
    query => query.Id,
    (schedule, query) => new SAASMsgSchedulerForQueueList()
    {
        ID = schedule.schedule.Id,
        BranchID = schedule.schedule.BranchId,
        TemplateID = schedule.schedule.TemplateId,
        TemplateContent = schedule.template.TemplateContent,
        Query = query.QuerySql,
        MessageType = schedule.schedule.MessageType,
        RecurringDatetime = schedule.schedule.RecurringDatetime,
    }).ToListAsync();

希望有人可以指导我如何解决这个问题。谢谢。

【问题讨论】:

    标签: c# .net linq datetime date-range


    【解决方案1】:

    你需要扭转这种情况。现在,您正在寻找今天之后开始并在今天之前结束的东西。

    最好以反映您想要的形式编写查询,即今天介于开始日期和结束日期之间:

    x.SchedulerStart.Date <= DateTime.Today && DateTime.Today <= x.SchedulerEnd.Date 
    

    更好的是,在 20 年后,如果我将字段放在此类查询的左侧,我仍然会混淆。不必翻译一个表达式来理解它的作用

    另一个改进是避免.Date。这会在 SQL Server 中生成 cast(ScheduleStart as date)。通常这样的强制转换会阻止索引的使用。 SQL Server 足够聪明,可以将其转换为范围查询,但不能使用为ScheduleStart 列收集的任何索引,并且仍然会导致执行计划效率低下。

    .Date 可以简单地从 DateTime.Today &lt;= x.SchedulerEnd.Date 中删除。如果结束日期是今天,则无论何时,DateTime.Today &lt;= x.SchedulerEnd 都成立。

    要从打开日期中删除.Date,请将其与第二天进行比较,即x.SchedulerStart &lt; DateTime.Today.AddDays(1)。如果开始日是今天,则每次都会如此。如果SchedulerStart 在第二天,则条件仍然为假。

    一个正确有效的条件是:

    x.SchedulerStart < DateTime.Today.AddDays(1) 
    && DateTime.Today <= x.SchedulerEnd
    

    【讨论】:

    • 谢谢你有用的回答。但它不会检查时间正确,只是检查日期范围之间?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2023-01-10
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多