Sql 如何将字符串数据与时间进行比较

Sql 如何将字符串数据与时间进行比较,sql,linq,Sql,Linq,我的数据类型为字符串,时间类似于06:00A,09:00P,等等。我想查询从6am到12pm的数据,如何将字符串数据转换为时间格式并在linq to sql中查询它?使用DateTime.ParseExact或DateTime.TryParseExact将字符串转换为日期。如果不能保证时间的字符串版本总是正确的,请坚持使用TryParseExact版本 将其转换为日期后,按常规进行查询 例如: 回复后编辑: 如果您使用的是针对EntityFramework编写的代码,那么不,这将不起作用。(还请

我的数据类型为字符串,时间类似于
06:00A
09:00P
,等等。我想查询从
6am
12pm
的数据,如何将字符串数据转换为时间格式并在linq to sql中查询它?

使用
DateTime.ParseExact
DateTime.TryParseExact
将字符串转换为日期。如果不能保证时间的字符串版本总是正确的,请坚持使用
TryParseExact
版本

将其转换为日期后,按常规进行查询

例如:

回复后编辑:

如果您使用的是针对EntityFramework编写的代码,那么不,这将不起作用。(还请注意,Linq To SQL和Entity Framework之间有很大的区别,但在某种程度上也适用相同的概念)

支持LINQ的ORM实际上是将where子句转换成一个语法,然后由ORM转换成SQL。您将得到一个NotSupported异常或类似的情况

问题中的表格使用该时间格式有什么原因吗?为什么不在表中使用日期时间?还可以选择在sql server中使用时间数据类型(假设您的目标是sql server),该数据类型映射到.net中的时间跨度类型

您可以在Sql server中定义表,如下所示:

create table log ( data varchar(20), logtime time )
LINQ表达式看起来像:

from x in Logs 
where x.Logtime >= new TimeSpan(6,0,0) && x.Logtime <= new TimeSpan(12,0,0)
select x
日志中x的


其中x.Logtime>=new TimeSpan(6,0,0)和&x.Logtime使用
DateTime.ParseExact
DateTime.TryParseExact
将字符串转换为日期。如果不能保证时间的字符串版本总是正确的,请坚持使用
TryParseExact
版本

将其转换为日期后,按常规进行查询

例如:

回复后编辑:

如果您使用的是针对EntityFramework编写的代码,那么不,这将不起作用。(还请注意,Linq To SQL和Entity Framework之间有很大的区别,但在某种程度上也适用相同的概念)

支持LINQ的ORM实际上是将where子句转换成一个语法,然后由ORM转换成SQL。您将得到一个NotSupported异常或类似的情况

问题中的表格使用该时间格式有什么原因吗?为什么不在表中使用日期时间?还可以选择在sql server中使用时间数据类型(假设您的目标是sql server),该数据类型映射到.net中的时间跨度类型

您可以在Sql server中定义表,如下所示:

create table log ( data varchar(20), logtime time )
LINQ表达式看起来像:

from x in Logs 
where x.Logtime >= new TimeSpan(6,0,0) && x.Logtime <= new TimeSpan(12,0,0)
select x
日志中x的


其中x.Logtime>=newtimespan(6,0,0)和&x.Logtime我建议编写自己的解析器,并将时间表示为
TimeSpan

TimeSpan? ToTimeSpan(string str)
{
  // get A or P at the end
  var amPm = str.Last();
  int hrs, mins;
  try
  {
    hrs = int.Parse(str.Substring(0, 2));
    mins = int.Parse(str.Substring(3, 2));
  }
  catch
  {
    return null;
  }
  switch (amPm)
  {
    case 'P': hrs += 12; break;
    case 'A': break;
    default: return null;
  }
  return new TimeSpan(hrs, mins, 0);
}

我建议编写自己的解析器,并将时间表示为
TimeSpan

TimeSpan? ToTimeSpan(string str)
{
  // get A or P at the end
  var amPm = str.Last();
  int hrs, mins;
  try
  {
    hrs = int.Parse(str.Substring(0, 2));
    mins = int.Parse(str.Substring(3, 2));
  }
  catch
  {
    return null;
  }
  switch (amPm)
  {
    case 'P': hrs += 12; break;
    case 'A': break;
    default: return null;
  }
  return new TimeSpan(hrs, mins, 0);
}

谢谢你的回复。我试图将时间与24小时军事时间进行比较,但它返回了所有记录。where语句是这样的:(a=>(ParseTime(a.MEETING\u START\u TIME).HasValue&&ParseTime(a.MEETING\u START\u TIME).Value.Hour>=6)和(ParseTime(a.MEETING\u END\u TIME).HasValue&&ParseTime(a.MEETING\u END\u TIME).Value.Hour我想问题是我正在使用Linq到entityframework和ParseTime()方法在where子句中未被调用。是否应在模型类中添加ParseTime()方法?感谢您的响应。我尝试将时间与24小时军事时间进行比较,但它返回所有记录。where语句如下:(a=>(ParseTime(a.MEETING\u START\u time)。HasValue&&ParseTime(a.MEETING\u START\u time)。Value.Hour>=6)&&&(ParseTime(a.MEETING_END_TIME).HasValue&&ParseTime(a.MEETING_END_TIME).Value.Hour我想问题是我正在使用Linq to entityframework,并且在where子句中没有调用ParseTime()方法。我应该在模型类中添加ParseTime()方法吗?