如何解决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。我知道那肯定不漂亮。将其变成用户定义的函数会更好!
在您评论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 举报,一经查实,本站将立刻删除。