微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql中的两个不同时间所经过的时间

如何解决sql中的两个不同时间所经过的时间

我有一个表,其中包含内容开始时间和完成时间,我想获取此数据的经过时间,我已经基于该数据进行了查询。但它无法正常工作。

开始时间:2020-09-04 15:21:34.703333 完成时间:2020-09-04 15:28:32:28

经过时间:00:06:57

如果开始和完成时间超过24小时

经过时间:1.00:06:57

SELECT 
starttime,completiontime,CONCAT (
CASE
  WHEN GETDATBETWEEN(completiontime,starttime) > 0 THEN CONCAT(GETDAYBETWEEN(COMPLETIONTIME,STARTTIME),'.') 
  WHEN GETDATBETWEEN(completiontime,starttime) < 0 THEN ''
ELSE ''
END
CASE
  WHEN SUBTRACT(GETHOUR(completiontime),GETHOUR(starttime)) > 0 THEN CONCAT(SUBTRACT(GETHOUR(completiontime),GETHOUR(starttime)),':') 
  WHEN SUBTRACT(GETHOUR(completiontime),GETHOUR(starttime)) < 0 THEN CONCAT(SUBTRACT(GETHOUR(completiontime),GETHOUR(starttime)) + 24,':') 
ELSE '0:'
END
CASE
  WHEN SUBTRACT(GETMINUTE(completiontime),GETMINUTE(starttime)) > 0 THEN CONCAT(SUBTRACT(GETMINUTE(completiontime),GETMINUTE(starttime)),':') 
  WHEN SUBTRACT(GETMINUTE(completiontime),GETMINUTE(starttime)) < 0 THEN CONCAT(SUBTRACT(GETMINUTE(completiontime),GETMINUTE(starttime)) + 60,':') 
ELSE '0:'
END
CASE
  WHEN SUBTRACT(GETSECOND(completiontime),GETSECOND(starttime)) > 0 THEN CONCAT(SUBTRACT(GETSECOND(completiontime),GETSECOND(starttime)),':') 
  WHEN SUBTRACT(GETSECOND(completiontime),GETSECOND(starttime)) < 0 THEN CONCAT(SUBTRACT(GETSECOND(completiontime),GETSECOND(starttime)) + 60,':') 
ELSE '0'
END ) AS elapsed_time
FROM sample;

谢谢

解决方法

您需要首先获取两个时间戳值之间的时差作为“原始”时间值。
在Denodo中,我相信您可以将两个值转换为毫秒,并获得如下差异:

package com.psychoticatt.outerrimcore.events;

import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;

public class PlayerIrradiatedEvent extends Event {
    private static final HandlerList handlers = new HandlerList();
    private Player player;
    private Boolean status;
    
    public PlayerIrradiatedEvent(Player p,boolean b) {
        player = p;
        status = b;
    }
    
    public Boolean getStatus() {
        return status;
    }
    
    public Player getPlayer() {
        return player;
    }
    
    public HandlerList getHandlers() {
        return handlers;
    }
    
    public static HandlerList getHandlerList() {
        return handlers;
    }
    
}

然后,您需要在下面的SQL语句中看到@ms的任何地方替换此“代码”(即 GETTIMEINMILLIS(Completiontime) - GETTIMEINMILLIS(Starttime)

"CASE WHEN @ms >=..." becomes "CASE WHEN GETTIMEINMILLIS(Completiontime) - GETTIMEINMILLIS(Starttime) >=..."

如果不需要毫秒,只需删除该行。当然,值86400000、360000、60000和1000分别代表一天,一小时,一分钟和一秒的毫秒数。您需要这些来获取需要显示的经过时间的每个部分的商和余数。我使用您的示例数据来测试SQL Server中的结果,如下所示,并显示了下面的经过时间,尽管我想您需要使用Denodo的GETTIMEINMILLIS代替DATEDIFF_BIG。我知道那肯定不漂亮。将其变成用户定义的函数会更好!

enter image description here

在您评论Denodo没有RIGHT功能(尴尬!)之后,我修改了上面的代码以使用REGEXP(我理解Denodo确实具有!)作为替代。

SELECT CONCAT(
       CASE WHEN @ms >= 86400000 THEN CONCAT( @ms / 86400000,'.') ELSE '' END,-- Days
       RIGHT('0' + CAST((@ms % 86400000) / 3600000 AS VARCHAR(2)),2),':',-- Hours        
       RIGHT('0' + CAST(((@ms % 86400000) % 3600000) / 60000 AS VARCHAR(2)),-- Minutes
       RIGHT('0' + CAST((((@ms % 86400000) % 3600000) % 60000) / 1000 AS VARCHAR(2)),'.',-- Seconds
       (((@ms % 86400000) % 3600000) % 60000) % 1000,-- Milliseconds
        '') AS "Elapsed Time"   

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?