我在两个已设置为整数的字段上进行SQL时间比较,而不是时间戳。
我在开发人员最初设置为int(8)的数据库中有一些性能指标。数据库包含事务的开始和结束时间。例如
某些样本数据可能
id | start_time | end_time
---------------------------
1 | 85958 | 90001
如果我简单地减去这两个值,那么当事务时间只有3时,我会得到4043秒。但我很难将值转换为允许我进行日期比较的时间格式。
我无法在应用程序中进行此计算,因为每天数据库中有100行,我正在尝试计算事务的平均和最大时间。
编辑:
澄清
时间以秒为单位 85958代表8:59:58 90001代表9:00:01
更糟糕的是,午夜0:01:00后1分钟将被表示为100。
答案 0 :(得分:3)
我在MySQL中对此进行了测试,但我确信该技术可以适用于DB2:
SELECT
(end_time DIV 10000) * 3600 +
((end_time DIV 100) % 100) * 60 +
end_time % 100 -
(start_time DIV 10000) * 3600 -
((start_time DIV 100) % 100) * 60 -
start_time % 100
FROM table1
结果:
3
它的工作方式是使用整数除法和模运算来提取每个时间戳的HH MM和SS部分,并将每个部分转换为秒。然后将秒加在一起以形成每个时间戳从午夜起的总秒数。这两者之间的差异给出了交易时间。
请注意,如果交易在午夜之前开始并在午夜之后结束,则此操作无效。您可能需要考虑这一天是否已更改并更正。如果您没有存储在数据库中的那一天,那么您可以查找负的转换时间并添加24小时以使它们为正,这应该给出正确的结果(只要交易的长度不超过一天,但我想这在实践中不太可能。)
我尝试为DB2编写此文件(未经测试):
SELECT
(end_time / 10000) * 3600 +
MOD(end_time / 100, 100) * 60 +
MOD(end_time, 100) -
(start_time / 10000) * 3600 -
MOD(start_time / 100, 100) * 60 -
MOD(start_time, 100)
FROM table1
答案 1 :(得分:3)
假设您正在使用DB2 for LUW,您可以使用以下几个函数来执行此操作:
如果值为100 = '00:01:00',则可以使用。
示例:
select
id,
MIDNIGHT_SECONDS(TRANSLATE('EF:GH:IJ',DIGITS(end_time),'ABCDEFGHIJ')) -
MIDNIGHT_SECONDS(TRANSLATE('EF:GH:IJ',DIGITS(start_time),'ABCDEFGHIJ')) as runtime
from
your_table;
如果start_time>上述表达式不起作用end_time(即start_time在午夜之前,但end_time在午夜之后)。
当然,这里真正的问题是使用INT来存储TIME。最好修复数据模型,使其使用TIME(或更好的TIMESTAMP)。
答案 2 :(得分:2)
您确定需要转换吗?也许这个数字代表毫秒,所以差异大约是4秒。
答案 3 :(得分:2)
我建议这些值实际上是指08:59:58和09:00:01小时:分钟:秒猜测结束差异是3
但是这些都是您需要向公司中的其他人询问他们的所有猜测 - 因为即使原始程序员已离开,其他人也必须使用这些
答案 4 :(得分:0)
已经描述的大多数答案都是有效的,但不幸的是,iSeries似乎对不同的功能进行了狡辩,因此我不得不定制给出的答案以使其发挥作用。
我得到的最终解决方案是
select
TIME(SUBSTR(DIGITS(END_TIME),1,2) CONCAT ':' CONCAT SUBSTR(DIGITS(END_TIME),3,2) CONCAT ':' CONCAT SUBSTR(DIGITS(END_TIME),5,2)) - TIME(SUBSTR(DIGITS(START_TIME),1,2) CONCAT ':' CONCAT SUBSTR(DIGITS(START_TIME),3,2) CONCAT ':' CONCAT SUBSTR(DIGITS(START_TIME),5,2))
from table1;
感谢所有快速而详细的回复