Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 甲骨文-总时数_String_Oracle_Sum - Fatal编程技术网

String 甲骨文-总时数

String 甲骨文-总时数,string,oracle,sum,String,Oracle,Sum,我有一个表,其中包含一些表示小时数的FROM/TO列: FROM TO 00:00 02:00 04:00 05:00 15:00 18:00 我需要对FROM/to行求和,看看它们是否等于24小时。不知道怎么做…理论 要解决此问题,您需要做两件事: 计算两个时间戳之间的时间差: 另一种选择是将这两列相减,然后乘以24(你应该得到小时数) 求和的结果基本上是Sum() 检查时间大于24小时 例1 因此,好的第一次尝试应该是: SELECT sum((toTime-fro

我有一个表,其中包含一些表示小时数的FROM/TO列:

FROM    TO
00:00   02:00
04:00   05:00
15:00   18:00
我需要对FROM/to行求和,看看它们是否等于24小时。不知道怎么做…

理论 要解决此问题,您需要做两件事:

  • 计算两个时间戳之间的时间差:
  • 另一种选择是将这两列相减,然后乘以24(你应该得到小时数)

  • 求和的结果基本上是
    Sum()

  • 检查时间大于24小时

  • 例1 因此,好的第一次尝试应该是:

    SELECT sum((toTime-fromTime)*24) from data;
    
    SELECT SUM(TO_NUMBER(SUBSTR("TO", 0, INSTR("TO", ':')-1)) - TO_NUMBER(SUBSTR("FROM", 0, INSTR("FROM", ':')-1)))
    FROM mytable
    
    D小提琴:

    简化示例的问题 然而,我们有一个问题,因为我们没有考虑这一天。因此,下一步还要使用GROUPBY函数,并按日期计算总小时数

    这里有一个解决方案:

    SELECT to_char(fromTime,'DD/MM/YYYY'), sum((toTime-fromTime)*24) from data
    group by to_char(fromTime,'DD/MM/YYYY');
    

    如果我们有24小时,则添加一个真/假:

    尽管Menelaos在处理真实时间戳方面有一个很好的答案(您可以将字符串转换为
    时间戳并使用该答案),但考虑到您有
    varchar2
    s且小时数总是相等,您可能会发现这一点很有用:

    要获取冒号前的数字部分,可以使用
    SUBSTR
    INSTR
    执行类似于
    SUBSTR(“To”,0,INSTR(“To”,':')-1)

    然后,您可以使用
    to_number
    将其转换为一个数字,方法是执行类似于
    to_number(SUBSTR(“to”,0,INSTR(“to”,“':”)-1))

    然后,您可以从“到”中减去“从”,以获得每一行的差值,并使用聚合
    将它们相加。因此,最终的查询类似于:

    SELECT sum((toTime-fromTime)*24) from data;
    
    SELECT SUM(TO_NUMBER(SUBSTR("TO", 0, INSTR("TO", ':')-1)) - TO_NUMBER(SUBSTR("FROM", 0, INSTR("FROM", ':')-1)))
    FROM mytable
    
    有几点意见:

    如果您确实知道时间总是偶数小时,那么将它们存储为数值将更有意义。您可以始终以不同的格式将它们呈现给用户,但存储“:00”只是多余的,并且会使处理这些值变得更加困难

    另一方面,如果您认为将来可能会有跨日期边界的分、秒或范围,那么只需使用更合适的类型(
    date
    timestamp
    )就可以省去很多麻烦


    在我的示例中,我双重引用了列名“TO”/“FROM”,因为它们是保留字。我不确定在列名中使用保留字是否通常被认为是良好的做法,但我倾向于避免使用保留字。

    这些列是什么类型的?只是varchar2?他们总是偶数小时吗?是的,总是偶数小时……是的,瓦查尔2