2017-02-14 169 views
0

我可以发誓,这是工作前两天,现在它抛出一个异常...问题与日期时间

我在DataTable检查,对一些数据。我基本上是在计算在过去15分钟内发现某个eventID的次数。下面是代码:

int startevents = trackingData 
    .Select("RHEventID = 3 AND RHDateEvent > #" + now + "#").Length; 

我定义之前刚才说的“现在”变量 - 是这样的:

DateTime now = DateTime.Now.AddMinutes(-15); 

但是,这将引发一个字符串未被识别为有效的DateTime例外。下面是在数据表中的数据的一个例子,在RHDateEvent列:

2017年2月14日十三时58分27秒下午 (编辑 - 是的,这是唯一一个日期,而不是两个,在列)

那么我在做什么错了?我需要以某种方式转换此DateTime吗?

+0

看(https://msdn.microsoft.com/en -us/library/w2sa9yss(v = vs.110).aspx) –

+6

DataTable中的单个列有两个日期吗? –

+1

使用“#”作为日期的分隔符可能存在问题。你是否在日期周围试过单引号。我假设您在输出测试数据时显示两个数据示例,而不是一个包含两个日期的日期字段。 – MikeS

回答

2

我d真的推荐使用Linq-To-DataTable,而不是旧的和有限的Select方法:

DateTime in15minutes = DateTime.Now.AddMinutes(15); 
var matchingRows = from row in trackingData.AsEnumerable() 
        where row.Field<int>("RHEventID) == 3 
        && row.Field<DateTime>("RHDateEvent") > in15minutes 
        select row; 

,如果你现在只需要计数使用:

int matchingRowCount = matchingRows.Count(); 

这是更具可读性,功能强大,支持编译时的安全性。


如果你的列是不是一个DateTime - 但string -column你需要分析它:在[这]

... 
&& DateTime.Parse(row.Field<string>("RHDateEvent"), CultureInfo.InvariantCulture) > in15minutes 
+0

谢谢蒂姆 - 这看起来不错,只是它在'in15minutes'变量上抛出一个错误,而' - 指定的转换无效'。有任何想法吗? – reviloSlater

+0

@reviloSlater:那么似乎'RHDateEvent'列不是'DateTime'列,而是f.e.一个'字符串'。那么你需要将它解析为'DateTime'。它有什么格式?这:'2017-02-14 13:58:27 PM'? –

+0

@reviloSlater:编辑我的答案,告诉你如何 –

0

它看起来像日期时间被复制......

2017-02-14 13:58:27 PM 2017-02-14 13:57:27 PM

代替

2017-02-14 13:58:27 PM

0

如果是LINQ到实体使用

var startevents = trackingData.Where(e => e.RHEventId = 3 && e.RHDateEvent >= DateTime.Now.AddMinutes(-15)).Count(); 
+0

为什么使用简单的方法? Challange !!!在哪里? – Lucas

+0

我知道*叹*,我多么懒! –