【问题标题】:time difference between datetime value SQLite C#日期时间值SQLite C#之间的时间差
【发布时间】: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-b a 和 b 的时候是相同的值。 prev = thisDateTime; 必须永远是你在循环中做的最后一件事

标签: c# sqlite


【解决方案1】:

一种方法是在 c# 端执行此操作:

DateTime? prev = null;

while(reader.Read()){
  DateTime thisDateTime = Convert.ToDateTime(reader[0]); 

  if(prev != null)
    Console.WriteLine("time diff is " + prev.Value - thisDateTime );


  prev = thisDateTime;
}

Prev 总是落后于当前日期

【讨论】:

  • 非常感谢您的解释和示例。我很感激。
  • 没问题;如果这是您最终使用的答案,请单击灰色复选标记将其变为绿色。这使人们可以从仪表板中看到您不再寻找答案。如果您仍在寻找(不同的)答案,请说明您需要什么
猜你喜欢
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 2013-09-08
  • 2011-12-10
相关资源
最近更新 更多