DATETIME - 来自Informix的HH:MM:SS格式的日期时间

时间:2016-09-15 17:18:17

标签: sql datetime informix

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

我正在使用Informix 11。

这是我使用的表达式:

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

结果:

  

0 05:50:23

如何摆脱领先的零点?

1 个答案:

答案 0 :(得分:3)

两个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)转换成第二个字符串?”它可能会影响选项。我正在使用我的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()函数是否提供了足够的格式控制(实际上,您需要检查它是否完全接受区间类型,以及如果给出一个类型,它会怎么做)。