【问题标题】:Date And Time Difference (hh:mm:ss) and Sum the Duration based on where conditions日期和时间差 (hh:mm:ss) 并根据 where 条件对 Duration 求和
【发布时间】:2020-01-17 22:12:12
【问题描述】:

在下面的查询中,我需要根据 where 条件获取表中 (HH:MM:SS) 中两个日期时间的持续时间,并且需要对总的 duration.in (hh:mm:ss) 求和 执行查询时返回错误为:

子查询返回超过 1 个值。这是不允许的,当 子查询遵循 =、!=、、>= 或当子查询用作 一个表达式。

在下面提到的查询中

SELECT CONVERT(TIME, DATEADD(s, SUM(( DATEPART(hh, (B.DateAndTime - A.DateAndTime)) * 3600 ) + ( DATEPART(mi, (B.DateAndTime - A.DateAndTime)) * 60 ) + DATEPART(ss, (B.DateAndTime - A.DateAndTime))), 0)) AS total_time 
FROM (SELECT DateAndTime, ROW_NUMBER() OVER (ORDER BY DateAndTime ASC) AS S FROM TableName WHERE Marker='S' and TagIndex=2 AND a.Val=Val) AS A
INNER JOIN
(SELECT DateAndTime, ROW_NUMBER() OVER (ORDER BY DateAndTime ASC) AS E FROM TableName WHERE Marker='E' and TagIndex=2 AND a.Val=Val) AS B
ON B.E=A.S) AS Duration
    FROM TableName AS a 
    Left join
    TableName a1 on a.Val=a1.Val
      Left join    
    TableName b1 on a.DateAndTime=b1.DateAndTime
     Left join
    TableName b2 on a.DateAndTime=b2.DateAndTime
     Left join
     TableName b3 on a.DateAndTime=b3.DateAndTime
    where a.TagIndex=2 and a.Marker='S' and a1.TagIndex=2 and a1.Marker='E'  and b1.TagIndex=1 and b2.TagIndex=4 and b3.TagIndex=0 and b3.Marker='S'             
     group by a.Val


DateAndTime             Millitm TagIndex    Val Status  Marker
2018-11-22 13:50:23.000 200       0        3000   S      S
2018-11-23 14:50:23.000 200       3         20    S      E     
2019-01-13 09:43:00.000 290       0        3000   S      S
2019-01-14 10:43:00.000 290       3         432   S      E




D1=E-S
D2=E-S
--------
DURATION=D1+D2

数据类型是时间,这就是为什么持续时间达到 23:59 小时。如果差异时间更长,那么它也只计算到 23:59 小时??

【问题讨论】:

  • 你在使用 SQL Server 吗?
  • @Abra 是的,我正在使用 sql server 谢谢

标签: sql sql-server


【解决方案1】:

这确实是一个评论,但格式作为答案更容易理解。

根据SQL Syntax Check Online,您的查询有错误:

您的 SQL 语法有错误;似乎错误就在附近: 'DATEADD( s, SUM( ( DATEPART(hh, (B.DateAndTime - A' at line 4)

这是由 SQL Syntax Check Online 创建的格式化查询
第4行是DATEADD(

SELECT
  CONVERT(
    TIME,
    DATEADD(
      s,
      SUM(
        (
          DATEPART(hh, (B.DateAndTime - A.DateAndTime)) * 3600
        ) + (
          DATEPART(mi, (B.DateAndTime - A.DateAndTime)) * 60
        ) + DATEPART(ss, (B.DateAndTime - A.DateAndTime))
      ),
      0
    )
  ) AS total_time
FROM
  (
    SELECT
      DateAndTime,
      ROW_NUMBER() OVER (
        ORDER BY
          DateAndTime ASC
      ) AS S
    FROM
      TableName
    WHERE
      Marker = 'S'
      and TagIndex = 2
      AND a.Val = Val
  ) AS A
  INNER JOIN (
    SELECT
      DateAndTime,
      ROW_NUMBER() OVER (
        ORDER BY
          DateAndTime ASC
      ) AS E
    FROM
      TableName
    WHERE
      Marker = 'E'
      and TagIndex = 2
      AND a.Val = Val
  ) AS B ON B.E = A.S
) AS Duration
FROM
  TableName AS a
  Left join TableName a1 on a.Val = a1.Val
  Left join TableName b1 on a.DateAndTime = b1.DateAndTime
  Left join TableName b2 on a.DateAndTime = b2.DateAndTime
  Left join TableName b3 on a.DateAndTime = b3.DateAndTime
where
  a.TagIndex = 2
  and a.Marker = 'S'
  and a1.TagIndex = 2
  and a1.Marker = 'E'
  and b1.TagIndex = 1
  and b2.TagIndex = 4
  and b3.TagIndex = 0
  and b3.Marker = 'S'
group by
  a.Val

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2019-05-26
    • 2018-07-25
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多