我们使用 firebird 作为本地测试数据库,我们的大多数客户使用 SQL Server 或 Oracle。
这适用于 MS SQL Server,但不适用于 Firebird。(还没有在 Oracle 上测试过)
CONVERT(char(8),MAX(p.end_Time)-MIN (p.start_Time),8) as duration
有没有办法为(Firebird、Oracle 和 MS Sql Server)完成同样的事情?
谢谢
我们使用 firebird 作为本地测试数据库,我们的大多数客户使用 SQL Server 或 Oracle。
这适用于 MS SQL Server,但不适用于 Firebird。(还没有在 Oracle 上测试过)
CONVERT(char(8),MAX(p.end_Time)-MIN (p.start_Time),8) as duration
有没有办法为(Firebird、Oracle 和 MS Sql Server)完成同样的事情?
谢谢
在 Oracle(Oracle 8i、Oracle 9i、Oracle 10g、Oracle 11g)上,您可以使用 to_char 函数:
select to_char( value, [ format_mask ], [ nls_language ] ) ....
例子:
SELECT TO_CHAR ( SYSDATE - TO_DATE ( '18-10-2012', 'dd-mm-yyyy' ), '9,999.99' ) as duration FROM DUAL;
firebird 上没有 CONVERT。
使用 CAST:
select cast(MAX(p.end_Time) as varchar(50))
等等...
对于 Firebird,您需要使用DATEDIFF
来获取两个时间戳(日期时间)之间的差异。这个 BTW 类似于SQL ServerDATEDIFF
。如果你想把它转换成char,你可以使用CAST
,例如CAST(DATEDIFF(DAY, MAX(p.end_Time), MIN(p.start_Time)) AS CHAR(8))
应该做的伎俩(或者你可以简单地做CAST(MAX(p.end_Time) - MIN (p.start_Time) AS CHAR(8))
,因为时间戳是可减去的。
我只是注意到您在您的选项中指定的选项CONVERT
将转换为hh:mi:ss
. Firebird 中没有这样的选项。如果您需要专门转换为hh:mi:ss
,您可能需要查看诸如FreeAdhocUDF(特别是F_SECONDS2PERIOD
)或rFunc UDF 之类的 UDF 库。如果一切都失败了,您可以编写自己的 UDF。