在日期时间对象列表中按时间范围进行筛选

本文关键字:时间 范围 筛选 日期 对象 列表 | 更新日期: 2023-09-27 18:31:39

我有一个日期时间对象列表。

我只需要从这个列表中获取那些日期的时间部分在"00:00:01"和"12:00:00"之间的对象。

如何查询此列表?

如果我进行SQL查询,我会这样做

SELECT TspCreated,
    CASE 
        WHEN cast(TspCreated as time) > '00:00:00' AND 
             cast(TspCreated as time) <= '12:00:00' 
             THEN '00 - 12'
        WHEN cast(TspCreated as time) > '12:00:00' AND 
             cast(TspCreated as time) <= '18:00:00' 
             THEN '12 - 18'
        WHEN cast(TspCreated as time) > '18:00:00' AND 
             cast(TspCreated as time) <= '23:59:59' 
             THEN '18 - 24'
    END AS TimeFrame
FROM MyTable

编辑:

感谢Jon Skeet的回答,我有办法使用时间跨度对象作为查询的边界。不幸的是,在我的情况下,该答案不适用,因为 Linq-to-Entities 不支持使用TimeOfDay属性。我最终使用了实体框架规范函数:

TimeSpan ts_0 = new TimeSpan( 0, 0, 0 );
TimeSpan ts_12 = new TimeSpan( 12, 0, 0 );
int NumOfIssues = ctx.MyEntitySet.Where( x => 
                      DbFunctions.CreateTime( x.TspUsed.Hour, x.TspUsed.Minute, x.TspUsed.Second ) >= ts_0 &&
                      DbFunctions.CreateTime( x.TspUsed.Hour, x.TspUsed.Minute, x.TspUsed.Second ) < ts_12).Count();

在日期时间对象列表中按时间范围进行筛选

在我看来

,您所需要的只是DateTime.TimeOfDay属性。然后,如果可以的话,我建议您稍微改变一下条件,以便下限是包容性的,上限是排他性的,例如

var time = dateTime.TimeOfDay;
if (time.Hours < 12)
{
    Console.WriteLine("Morning");
}
else if (time.Hours < 18)
{
    Console.WriteLine("Afternoon");
}
else
{
    Console.WriteLine("Evening");
}

举个例子来说明为什么这很方便,您当前的分类完全排除了午夜以及晚上 11:59:59 和午夜之间的任何内容,例如 11:59:59.999。

或者,您可以为边界创建适当的TimeSpan值,并使用常规<<=等运算符。例如:

TimeSpan noon = new TimeSpan(12, 0, 0);
TimeSpan sixPm = new TimeSpan(18, 0, 0);
TimeSpan time = dateTime.TimeOfDay;
if (time < noon)
{
    ...
}
else if (time < sixPm)
{
    ...
}
else
{
    ...
}

请注意,使用这两种方法,我只检查每个if语句的一个条件,因为我基本上从午夜开始在一天中移动。如果你只想检查中间的一个波段,你可以说:

if (noon <= time && time < sixPm)
顺便说一句

,我从来不喜欢TimeOfDay返回TimeSpan - 经过的时间与一天中的时间不同。如果你也有同样的感觉,并且你正在做大量的日期/时间工作,你可能要考虑看看我的Noda Time项目,它有更多的类型来表示日期和时间的各个方面。