LINQ查询未统计日期时间验证



这是我的LINQ,用于返回匹配的记录

var staffawards = await _context.StaffAwards.FirstOrDefaultAsync(c => c.StaffID == StaffAwards.StaffID && c.EmpID == StaffAwards.EmpID && c.AwardDate == StaffAwards.AwardDate);

员工奖。AwardDate将采用这种格式";09/12/2020 12:00:00 AM";而我的表中的颁奖日期将是这样的";2020-12-09 17:16:00.000";

如何转换StaffAwards。Sql Server日期时间中的AwardDate?AnyHelp将不胜感激。

如果您的代码和数据库使用Date/DateTime类型,而不是字符串,那么您需要了解以下几点:

  • 日期数据类型没有格式,只有根据日期创建的字符串才有格式。无论你在代码/sql查询工具中看到什么格式,都是它在向你显示日期时应用的格式(它必须将日期转换为字符串才能显示(
  • 时间为午夜的日期时间与时间为17:16的日期时间完全不同,就像数字1.0与1.75352完全不同一样;如果你使用equals并传递除午夜以外的任何时间,你永远不会得到一个数据库来返回午夜时间的记录,就像你永远不会成功地通过询问"某人的年龄是1.0"来获得一个记录一样;其中年龄=1.75352〃

要么像数据库一样将参数设置为午夜,要么使用参数范围(如果数据库中的日期也有其他时间(

//if the db date is always midnight
.Where(x => x.DateColumnInDb == datetimeParameter.Date);
//if the db might have times too
.Where(x => x.DateColumnInDb >= datetimeParameter.Date && x.DateColumnInDb < datetimeParameter.Date.AddDays(1));

通过使用范围,我们不会冒险要求数据库在每次查询时转换表中的每个日期时间。在where子句中转换数据通常是个坏主意,因为它通常会导致显著的性能损失,因为索引无法使用

此外,请确保你的.net端日期时间和数据库时间使用相同的时区,否则它们实际上指的是不同的时间

要将日期与数据库格式一起使用,可以使用DbFunctions。

像这样:

var staffawards = await _context.StaffAwards.FirstOrDefaultAsync(c => c.StaffID == StaffAwards.StaffID && c.EmpID == StaffAwards.EmpID && DbFunctions.TruncateTime(DateTime.Parse(c.AwardDate)) == StaffAwards.AwardDate);

重要提示:对于TruncateTime,您必须使用DateTime。您必须将c.AwardDate转换为DateTime。DateTime.Parse(c.AwardDate)

最有可能的是,您将SQL服务器安装在一台单独的机器上,这可能是由于日期格式不同。

但没有必要进行这种转换,实体框架会自动为您进行转换。如果你只是比较日期,你可以使用这个代码:

var staffawards = await _context.StaffAwards.FirstOrDefaultAsync(c => c.StaffID == StaffAwards.StaffID && c.EmpID == StaffAwards.EmpID && c.AwardDate.Date == StaffAwards.AwardDate.Date);

最新更新