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

标签 sql datetime comparison db2 ibm-midrange

我正在努力对已设置为整数而不是时间戳的两个字段进行 SQL 时间比较。

我在开发人员最初设置为 int(8) 的数据库中有一些性能指标。数据库包含事务的开始和结束时间。例如

一些样本数据可能是

id | start_time | end_time
---------------------------
1  |      85958 | 90001 

如果我只是将这两个值相减,我会得到 4043 秒,而交易时间只有 3 秒。但是我正在努力将这些值转换为允许我执行日期比较的时间格式。

我无法在应用程序中进行此计算,因为每天数据库中有 100 行,我正在尝试计算事务的平均和最大时间。

编辑:

澄清

时间以秒为单位
85958 代表 8:59:58 90001 代表 9:00:01

更糟糕的是,午夜 0:01:00 后 1 分钟将被表示为 100。

最佳答案

我在 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

关于sql - 将 SQL 编号转换为时间,以执行日期比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3729630/

相关文章:

mysql - mysql中如何将行转换为列

php - 使用 PDO 通过单个查询插入多行

c++ - 如何实现通用 switch/case,它也适用于一般 C++ 类型并且语法相似?

SQL:如何只选择 money 字段的 'cents' 部分中非零的行?

php - 每天从 CSV 文件更新 MySQL(存储过程中不允许加载数据)

php - 将过滤器从接受今天更改为同时接受昨天+今天

sql - 获取 DateTime 的 T-SQL 代码仅包含来自任何 DateTime 的月份和年份

javascript - 我的 Asp.net 网格中的日期时间字段格式

javascript - "value === false"更优雅的替代方案?

jquery - 何时使用 $(this) 不是更慢吗?