DATETIME - 来自 Informix 的 HH:MM:SS 格式的 DATETIME

Posted

技术标签:

【中文标题】DATETIME - 来自 Informix 的 HH:MM:SS 格式的 DATETIME【英文标题】:DATETIME - DATETIME in HH:MM:SS format from Informix 【发布时间】:2016-09-15 17:18:16 【问题描述】:

我有 2 个字段 (login,logout) 带有 UNIX 时间的 INTEGER 类型,但是当我使用 DBINFO 进行减法 (logout-login) 时,它返回:0 05:50:23,但我需要那个值 没有 em> 第一个数字(在这种情况下为零)。

我正在使用 Informix 11。

这是我使用的表达方式:

DBINFO('utc_to_datetime', logout) -
DBINFO('utc_to_datetime', login)

结果:

0 05:50:23

如何去掉前导零?

【问题讨论】:

SUBSTRING(DBINFO('utc_to_datetime', login), 2, 8) ? 只会返回两个值之一。我想要的是没有第一个零的结果。我知道减法的结果是一个区间,但我不知道如何格式化它以显示 05:50:23 你在说什么减法?什么间隔?我建议使用 STRING 函数从位置 2 开始将字符移到右侧。这里......再次......试试吧...... SUBSTRING('0 05:50:23', 2, 8) @RicardoC:问题的原始版本不清楚/不完整;结果是两个DBINFO(…) 表达式的差异。因此,您的 SUBSTRING 建议必须进行修改以包含全部差异。只要时间间隔是个位数的天数,它就会起作用,这并不令人难以置信。存在一个问题,即 3 天 5 小时 50 分钟 23 秒的登录期是否应报告为 77:50:23 或其他内容。 @JonathanLeffler 我现在看到了。你在所有方面都是对的。谢谢你的澄清。 【参考方案1】:

两个DATETIME YEAR TO SECOND 值之间的差异默认是一个INTERVAL DAY(n) TO SECOND 值(n = 8),而前面的0 告诉您之间的差异有0天(加上5小时等)时代。看来你宁愿得到一个INTERVAL HOUR(9) TO SECOND 结果,所以你需要请求它:

SELECT CAST(DBINFO('utc_to_datetime', logout) -
            DBINFO('utc_to_datetime', login) AS INTERVAL HOUR(9) TO SECOND)
  FROM AnonymousTableWithColsLoginAndLogout

测试:

CREATE TABLE AnonymousTableWithColsLoginAndLogout
(
    login INTEGER NOT NULL,
    logout INTEGER NOT NULL
);
INSERT INTO AnonymousTableWithColsLoginAndLogout VALUES(1473961283, 1473961283 + (5 * 60 + 50) * 60 + 23);
SELECT CAST(DBINFO('utc_to_datetime', logout) -
            DBINFO('utc_to_datetime', login) AS INTERVAL HOUR(9) TO SECOND)
      FROM AnonymousTableWithColsLoginAndLogout
;

结果:

5:50:23

关键是知道从差异返回的数据类型,并知道如何将其转换为您想要的类型。

注意,如果有 3 天 5 小时 50 分钟 23 秒的差异,那么结果将显示为77:50:23

顺便说一句,您可以通过以下方式避免使用 DBINFO:

SELECT CAST((logout - login) UNITS SECOND AS INTERVAL HOUR(9) TO SECOND)
  From AnonymousTableWithColsLoginAndLogout;

它产生相同的答案。


有没有办法获得这种格式:HH:MM:SS。我的意思是,在你给我的例子中,有没有办法在数字 5 之前添加一个零?

不确定,但可能。一个问题是“您使用哪种语言收集结果”?或者“您如何将 INTERVAL DAY(9) TO SECOND 转换为字符串”?它可能会影响选项。我正在使用我的 SQLCMD——一个 DB-Access 工作有点相似但更好的程序。如果您需要在类似的环境中执行此操作,而不是 C 或 Java 或 C# 或……,那么您可以编写 ghastligrams 来检查字符串中是否有单个前导数字,如果没有则添加零。还有一个技巧:

SELECT EXTEND(DATETIME(2000-01-01 00:00:00) YEAR TO SECOND +
       CAST((logout - login) UNITS SECOND AS INTERVAL HOUR(9) TO SECOND), HOUR TO SECOND)
  From AnonymousTableWithColsLoginAndLogout;

在之前的样本数据上,产生了预期的结果:

05:50:23

DATETIME 文字中指定的日期是任意的;关键是使用“午夜”。结果现在是 DATETIME HOUR TO SECOND 而不是 INTERVAL HOUR(9) TO SECOND 或类似的。这意味着,如果您有 24 小时或更长时间的间隔,您将无法获得良好的数据表示,因为它会产生以 24 小时为模的答案。添加将成功,但有关额外天数的信息将被丢弃。对于少于 24 小时的间隔,就可以了。

在格式化 INTERVAL 时,您可能需要查看 TO_CHAR() 函数是否提供足够的格式控制(实际上,您需要检查它是否完全接受间隔类型,以及如果给定它会做什么)。

【讨论】:

非常感谢,但是,有没有办法获得这种格式:HH:MM:SS,我的意思是,在你给我的例子中,在数字 5 之前添加一个零?

以上是关于DATETIME - 来自 Informix 的 HH:MM:SS 格式的 DATETIME的主要内容,如果未能解决你的问题,请参考以下文章

在 UPDATE 查询中使用 DateTime 或字符串参数时,Informix 11.7 返回 -1 作为受影响的行数

Informix SQL 比较 Where 语句上的 DateTime 值

确保在 Informix DATETIME 列上使用索引

保存 Informix DATETIME YEAR TO SECOND 值的等效 Java 数据类型?

带有准备好的语句的 Informix 日期时间

Informix 和 .NET 的时间和日期时间格式