运算符 >= 不能应用于字符串和日期时间类型的操作数
本文关键字:时间 日期 类型 操作数 字符串 不能 应用于 运算符 | 更新日期: 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
。
话虽如此,通过进行转换,您正在验证数据,如果格式不正确,则可能会显示错误。