我有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
。
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类型,它会做什么)。