运算符 >= 不能应用于字符串和日期时间类型的操作数

本文关键字:时间 日期 类型 操作数 字符串 不能 应用于 运算符 | 更新日期: 2023-09-27 18:32:13

用户在URL中输入两个参数,即开始日期和结束日期,并以字符串yyyyMMddhhmm格式输入。我正在尝试获取这些字符串并将它们转换为日期,以便我可以查询我的数据库。

[ResponseType(typeof(Detail))]
public IHttpActionResult GetDetail(string StartDate, string EndDate)
{
    DateTime StartDateTime;
    DateTime EndDateTime;
    StartDateTime = new DateTime();
    EndDateTime = new DateTime();
    StartDateTime = DateTime.ParseExact(StartDate, "yyyyMMddhhmm", null);
    EndDateTime = DateTime.ParseExact(EndDate, "yyyyMMddhhmm", null);
    var detail = from a in db.Details where (a.callDate >= StartDateTime && a.callDate <= EndDateTime) select a;
    var Response = new DetailResponse() { status = true, calls = detail };
    return Ok(response);
}

但是,我收到错误,>=不能在日期时间和字符串中使用。

编辑:为了其中一个答案,我包含一个用于显示数据的模型类。

详细响应.cs

public class DetailResponse
{
    public bool status { get; set; }
    public string statusMessage { get; set; }
    public IQueryable<Detail> calls { get; set; }
}

运算符 >= 不能应用于字符串和日期时间类型的操作数

可能这种情况正在发生,因为callDate是一个字符串。因此,您无法将字符串与日期时间进行比较。此问题的解决方案是具有相同的类型。话虽如此,我会a.callDate转换为DateTime.

但是,我认为最好在数据库级别更改callDate的数据类型。毫无疑问,这是个人意见。所以你不必遵循它。这样做,您的代码将不需要任何更改。

现在,就代码而言,我上面建议的解决方案如下:

var allDetails = db.Details.AsEnumerable();
var details = from detail in details
              let callDate = DateTime.ParseExact(detail.callDate, "yyyyMMddhhmm", null)
              where callDate >= StartDateTime 
              && callDate <= EndDateTime
              select detail;

更新

正如我们在评论中总结的那样,我们必须调用AsEnumerable,以便上述查询正常工作。为什么需要这样做?

借用 Jon Skeet 在《将 Linq 重新实现到对象:第 36 部分 – AsEnumerable》中的话

现在,想要执行某些方面的 在数据库中查询,然后在 .NET 中进行更多操作 – 特别是如果有些方面你基本上无法实现 LINQ to SQL(或你正在使用的任何提供程序)。例如,您可能 想要构建一个特定的内存表示,但实际上并不是 适合提供程序的模型。

无法在数据库方法中正确转换DateTime.ParseExact

由于数据库中的日期是字符串类型,因此比较失败,请尝试执行以下操作:

[ResponseType(typeof(Detail))]
public IHttpActionResult GetDetail(string StartDate, string EndDate)
{
    DateTime StartDateTime = DateTime.ParseExact(StartDate, "yyyyMMddhhmm", null);
    DateTime EndDateTime = DateTime.ParseExact(EndDate, "yyyyMMddhhmm", null);
    var detail = from a in db.Details where (DateTime.ParseExact(a.callDate, "yyyyMMddhhmm", null) >= StartDateTime && 
                    DateTime.ParseExact(a.callDate, "yyyyMMddhhmm", null) <= EndDateTime) select a;
}

但是,您最好将callDate的类型追逐到日期而不是string

您的架构是什么样的? callDate是字符串吗? 您可能需要先将callDate转换为DateTime,然后才能进行比较。

var detail = from a in db.Details where (Convert.ToDateTime(a.callDate) >= StartDateTime &&  Convert.ToDateTime(a.callDate) <= EndDateTime) select a;

如前所述,您无法将字符串与日期时间进行比较,但是,鉴于日期格式为

(即年月日小时分钟),其中值都是数字,从最小变化到>变化最大,您将安全地进行字符串比较:

var detail = from a in db.Details where (a.callDate >= StartDate && a.callDate <= EndDate) select a;

这是因为在比较字符串时,"201601010101"小于"201612312359"(就像"a"小于"b"一样)。

这将节省将数据转换为DateTime

话虽如此,通过进行转换,您正在验证数据,如果格式不正确,则可能会显示错误。