【问题标题】:how to sum up minutes and seconds ?in oracle如何总结分钟和秒?在oracle中
【发布时间】:2017-08-03 08:19:24
【问题描述】:

我有一个名为duration_d 的列,即varchar2,该表中的数据如下所示

duration_d
-----------
12:25
01:35
12:10
04:21
12:18
12:24

我试过下面的查询

SELECT SUM( to_date( duration_d, 'mi:ss' ))
  FROM table 
 GROUP BY calling_number;

当我执行它时会出现以下错误

ORA-00933: SQL command not properly ended
00933. 00000 -  "SQL command not properly ended"

谁能告诉我怎么计算?

【问题讨论】:

  • 您不能将 sum 与日期一起使用。当您对这些持续时间求和时,您期望什么值? Ps:另外一件事:如果要使用to_date,则必须添加其余信息,而不仅仅是持续时间:例如:to_date('2000-01-01 00:'||dur,'yyyy-mm- dd hh24:mi:ss')

标签: sql oracle


【解决方案1】:

要获得一天中的总和,您可以使用:

SELECT SUM( TO_DATE( duration_d, 'MI:SS' ) - TO_DATE( '00:00', 'MI:SS' ) ) AS total
FROM   your_table

结果如下:

TOTAL
------------------------------------------
0.0383449074074074074074074074074074074074

要将其转换为区间数据类型,您可以使用NUMTODSINTERVAL

SELECT NUMTODSINTERVAL(
         SUM( TO_DATE( duration_d, 'MI:SS' ) - TO_DATE( '00:00', 'MI:SS' ) ),
         'DAY'
       ) AS total
FROM   your_table

结果如下:

TOTAL
-------------------
+00 00:55:13.000000

【讨论】:

    【解决方案2】:

    请尝试以下:

    with x as 
    (select sum((regexp_substr(YOUR_COLUMN, '[0-9]+', 1, 1)*60) + 
                 regexp_substr(id, '[0-9]+', 1, 2)) seconds 
    from YOUR_TABLE)
    SELECT 
        TO_CHAR(TRUNC(seconds/3600),'FM9900') || ':' ||
        TO_CHAR(TRUNC(MOD(seconds,3600)/60),'FM00') || ':' ||
        TO_CHAR(MOD(seconds,60),'FM00')
    FROM x
    

    仅当持续时间始终为 [MI:SS] 时才有效。

    您也可以根据需要添加组。

    将秒转换为所需的持续时间格式Reference

    分组方式

    with x as 
    (select calling_number,sum((regexp_substr(YOUR_COLUMN, '[0-9]+', 1, 1)*60) + 
                 regexp_substr(id, '[0-9]+', 1, 2)) seconds 
    from YOUR_TABLE
    group by calling_number)
    SELECT calling_number, 
        TO_CHAR(TRUNC(seconds/3600),'FM9900') || ':' ||
        TO_CHAR(TRUNC(MOD(seconds,3600)/60),'FM00') || ':' ||
        TO_CHAR(MOD(seconds,60),'FM00')
    FROM x
    

    【讨论】:

      【解决方案3】:

      使用SUBSTRto_charto_dateNVLINSTRreverseSUM 的组合。

      SELECT "calling_number",
      to_char(to_date(SUM(NVL(SUBSTR("duration_d", 0, INSTR("duration_d", ':')-1), "duration_d"))*60 +
      SUM(substr("duration_d", - instr(reverse("duration_d"), ':') + 1)),'sssss'),'hh24:mi:ss') AS SUM_DURATION_D
      FROM yourtable
      GROUP BY "calling_number"
      

      输出

      calling_number  SUM_DURATION_D
      1               00:26:10
      2               00:29:03
      

      SQL 小提琴:http://sqlfiddle.com/#!4/9b0a81/33/0

      【讨论】:

      • 谢谢,但我想通过呼叫号码进行分组 group by 不工作
      • ORA-01722: 无效号码 01722. 00000 - “无效号码” *原因:指定的号码无效。 *操作:指定一个有效的数字。
      • 您将分钟总和乘以 60,然后将秒总和除以 60 的第一个字符相加作为第一个数字......它不起作用。您不需要将他的分钟乘以 60,如果秒数总和为 4 位或更多位数,那么您将得到错误的答案。您最好使用TRUNCFLOORMOD 来获得秒总和的分钟和秒分量。
      • @MT0 你的权利,我已经完成了我的回答以允许任何数量的值,并且还按问题修复了他们的组
      • @bharathRaj 试试我的新答案
      【解决方案4】:

      正确拼写如下

      SELECT SUM( TO_DATE( duration_d, 'mi:ss' ) )
       FROM YOURTABLE Group By calling_number
      

      【讨论】:

      • 感谢您的更正,但如果我在上面运行查询,它会给出此 ORA-00932:不一致的数据类型:预期的 NUMBER 得到 DATE 00932。00000 -“不一致的数据类型:预期的 %s 得到了 %s”跨度>
      • 为什么要投反对票...我的回复解决了相关问题。
      • 谢谢,但它没有解决问题@Prathyush
      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多