String 甲骨文-总时数
我有一个表,其中包含一些表示小时数的FROM/TO列: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
00:00 02:00
04:00 05:00
15:00 18:00
我需要对FROM/to行求和,看看它们是否等于24小时。不知道怎么做…理论
要解决此问题,您需要做两件事:
Sum()
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