【发布时间】:2021-12-23 19:53:26
【问题描述】:
我在 SQLite 数据库中有一条 DateTime 记录。
time
11-08-2021 15:16:44
11-08-2021 17:09:22
11-09-2021 17:20:39
...
11-11-2021 09:31:54
11-11-2021 10:35:37
11-11-2021 10:45:11
11-11-2021 11:54:28
我使用过滤掉特定日期范围内的日期时间
string date = DateTime.Now.AddHours(-3).ToString("MM-dd-yyyy HH:mm:00Z");
string query = $"SELECT * FROM LastRun WHERE LastUpdateTime > '{queryDate}' ";
我能够得到如下结果。
time
11-11-2021 09:31:54
11-11-2021 10:35:37
11-11-2021 10:45:11
11-11-2021 11:54:28
接下来是我想得到彼此之间的时差,如下所示。
time difference (hour)
11-11-2021 09:31:54 1
11-11-2021 10:35:37 ??
11-11-2021 10:45:11 ??
11-11-2021 11:54:28 ??
是否可以像这样获取时差以及如何查询和获取时差?有什么建议吗?
编辑:
现在我有一个固定的时间跨度,即“00:10:00”。我想比较之前和这个时间跨度的时间差。但是,我得到错误的结果,因为当我尝试插入值时,'(thisDateTime - prev.Value)' 的值变为'00:00:00"。请看这张图片 (Result)。所以,所有返回的结果变成'1'。
while(reader.Read())
{
......
prev = thisDateTime;
TimeSpan fixTimeDiff = new TimeSpan(0, 10, 0);
//Console.WriteLine(fixTimeDiff);
var d = thisDateTime - prev.Value;
int compare = TimeSpan.Compare(fixTimeDiff, d);
Console.WriteLine("{0} {1} {2} ( Compare should return {3} )",
fixTimeDiff, compare == 1 ? ">" : compare == 0 ? "=" : "<", d,
compare);
}
【问题讨论】:
-
AIUI,SQLite 没有日期时间的固有列类型,所以我猜这些是字符串。不确定您的 dd-MM-yyyy > '{yyyy-MM-dd}' 是如何工作的。但是,SQLite 确实了解 LAG 和 LEAD,它们允许您访问“当前行周围的行”。因此,您将查看
24 * (datetime(x) - datetime(lag(x) over(order by x)))形式的内容,以了解小时数的差异。您不一定需要 sqlite 来执行此操作;您可以在 C# 中foreaching 结果并执行(thisDateTime - lastDataTime).TotalHours,然后在每个行循环上更新lastDateTime = thisDateTime -
@CaiusJard 您好,感谢您的回复。假设上面的结果是用这段代码得到的..... SQLiteDataReader reader = commandReader.ExecuteReader(); while (reader.Read()) { DateTime thisDateTime = Convert.ToDateTime(reader[0]); Console.WriteLine("thisDateTime" + thisDateTime);我如何分配另一个值,即 'lastDateTime' 就像你建议的 '(thisDateTime - lastDateTime)' 。我很困惑,因为所有的日期时间都属于'thisDateTime'?有参考吗?
-
您在循环结束时执行此操作,以便下次循环运行时是上一次。我举个例子
-
嗨@CaiusJard,我对此有疑虑。我已经编辑了这个问题,你有空时可以看看吗?
-
你把
prev = thisDateTime;放在thisDateTime - prev之前的代码,所以它当然总是返回0;当你做a-ba 和 b 的时候是相同的值。prev = thisDateTime;必须永远是你在循环中做的最后一件事