如何使用SQLite读取C#中具有特定日期的记录?

3npbholx  于 2023-10-23  发布在  SQLite
关注(0)|答案(1)|浏览(152)

在一个MAUI项目中,我有一个非常简单的表,我想在其中保存用户在应用程序上花费的时间。基于这个原因,我定义了这个模型

public class Statistic
{
    public DateTime ScreenDate { get; set; }
    public long Minutes { get; set; }
}

然后,在持久层中,我创建数据库,然后我有一个函数,我试图读取带有日期的记录。在下面的代码中,dt是定义为DateTime的参数。

List<Statistic> rsl = await Database.Table<Statistic>()    
  .Where(s => 
         s.ScreenDate.ToShortDateString() == dt.ToShortDateString())
  .ToListAsync();

当我尝试运行这段代码时,我得到一个错误
SQLite.SQLiteException:'无此功能:到短日期字符串'
我尝试了其他函数--比如ToString()--得到了一些结果。

更新

我尝试使用System.Data.Entity.SqlServer

List<Statistic> rsl = await Database.Table<Statistic>()
   .Where(s => SqlFunctions.DatePart("year", s.ScreenDate) == dt.Year &&
          SqlFunctions.DatePart("month", s.ScreenDate) == dt.Month &&
          SqlFunctions.DatePart("day", s.ScreenDate) == dt.Day).ToListAsync();

我得到了一些错误

kpbpu008

kpbpu0081#

SQLite无法将C#方法转换为SQL方法。如果你尝试过使用 SqlFunctions,但效果不好,让我们使用一些经典的原始C#代码和逻辑:)

var startDate = new DateTime(dt.Year, dt.Month, dt.Day);
var endDate = startDate.AddDays(1);

var rsl = await Database.Table<Statistic>()
                        .Where(s => s.ScreenDate >= startDate && s.ScreenDate < endDate)
                        .ToListAsync();

你想要得到的是某一天的统计数据列表(忽略时间),所以我们只需要创建两个新的变量,startDate和endDate,其中startDate是你的原始日期,但忽略时间(00:00:00),endDate是第二天,也忽略时间(00:00:00)。之后,我们只需要过滤大于或等于startDate和小于endDate。

真实的示例:

**原始日期:**08/08/2023 10:07:25
**开始日期变量:**08/08/2023 00:00:00
**结束日期变量:**09/08/2023 00:00:00
其中条件:ScreenDate >= 08/08/2023 00:00:00ScreenDate < 09/08/2023 00:00:00

因此,它将返回08/08/2023 00:00:00到08/08/2023 23:59:59(第二天之前的1个刻度)之间的所有记录。

相关问题