【问题标题】:SQL : Get the duration between start DateTime and End DateTime from Table entriesSQL:从表条目中获取开始日期时间和结束日期时间之间的持续时间
【发布时间】:2021-08-03 19:57:51
【问题描述】:

我有一个 SQL 表,其中包含机器开始和结束时间 (DateTime) 的条目以及机器运行的持续时间。给定开始日期时间和结束日期时间,我想计算机器运行的持续时间。 DB 是 SQL,代码是 C#。

注意:机器在给定的开始和结束日期时间之间可能有一段时间没有运行,我想在总计算期间忽略该持续时间。

考虑例子

Start Time Machine End Time Machine Duration(Mins)
1:00:01 2:00:00 - 60
2:00:01 2:30:00 - 30
3:00:01 4:00:00 - 60

如果选择的开始时间是 1:40:00,结束时间是 3:20:00(注意机器在 2:30:00 到 3:00 之间没有运行)

如何在 SQL 中获取持续时间?

对于上面的例子,答案应该是 70 分钟。

1:40:00 to 2:30:00 - 50Mins
3:00:00 to 3:20:00 - 20Mins
Total = 70mins  between 1:40:00 and 3:20:00

【问题讨论】:

  • 我删除了不一致的数据库标签。请仅使用您真正使用的数据库进行标记。
  • 最好在 c# 中做。 SQL 查询变得复杂。
  • @jdweng 这是一个简单的 sql 查询,看我的回答;)

标签: c# sql postgresql datetime


【解决方案1】:

你可以这样做,我在 sql server 中写过(假设你在微软生态系统中),但你可以在任何其他 dbms 中做同样的事情)

select sum(datediff(minute, case when startdate <@startdate then @startdate else startdate end,case when enddate < @enddate then enddate else @enddate end))
from cte
where @startdate <= enddate and @enddate >= startdate

db小提琴here

在 postgresql 中你可以这样做:

select extract( epoch from sum(case when enddate < enddatevar then enddate else enddatevar end - case when startdate <startdatevar then startdatevar else startdate end)) /60 
from cte
where startdatevar <= enddate and enddatevar >= startdate

【讨论】:

  • DATEDIFF 在 PostgreSQL 中不可用,我如何在 PostgreSQL 中做同样的事情?
  • @LetsCode 查看更新后的答案,应该可以工作(如果我没有出错的话)
  • 考虑,还有一个开始时间和结束时间为空的条目(机器仍在运行)在上面的场景中,这个条目将不会被考虑,是否可以将这个结束时间的条目视为当前条目时间 ?如果是,怎么做?
  • @LetsCode 在 smae 查询中,如果结束日期为空,请将其替换为 currentdate:coalesce(endate , now())
【解决方案2】:

在 SQL 中你可以这样做:

 SELECT SUM(DATEDIFF(MINUTE, EndTime,StartTime)) FROM table_name

或者,在 C# 中,假设您获得具有 StartTimeEndTime 属性的对象集合:

var duration = results.Sum(x => x.EndTime.Subtract(x.StartTime).TotalMinutes);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-06
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    相关资源
    最近更新 更多