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



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

我正在使用Informix 11。

这是我使用的表达式:

DBINFO('utc_to_datetime', logout) -
DBINFO('utc_to_datetime', login)
结果:

0 05:50:23

如何去掉前导零?

两个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之前加一个0 ?

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

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文本中指定的日期是任意的;关键是要用"midnight"。结果现在是DATETIME HOUR TO SECOND而不是INTERVAL HOUR(9) TO SECOND或类似的。这意味着如果你有一个24小时或更长时间的间隔,你不会得到一个很好的数据表示,因为它会产生一个对24小时取模的答案。添加将成功,但关于额外天数的信息将被丢弃。如果间隔时间小于24小时,则没有问题。

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

最新更新