将SQL编号转换为时间,以执行日期比较

时间:2010-09-16 18:30:32

标签: sql datetime comparison db2 ibm-midrange

我在两个已设置为整数的字段上进行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。

5 个答案:

答案 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,您可以使用以下几个函数来执行此操作:

  • DIGITS() - 为您提供整数
  • 的零填充字符串
  • TRANSLATE() - 重新格式化字符串
  • MIDNIGHT_SECONDS - 返回午夜以来的秒数。

如果值为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;

感谢所有快速而详细的回复