Sql 打字日期时间差

Sql 打字日期时间差,sql,sql-server,oracle,firebird,Sql,Sql Server,Oracle,Firebird,我们使用firebird作为本地测试数据库,我们的大多数客户机使用SQL Server或Oracle 这适用于MS SQL Server,但不适用于Firebird。(尚未在Oracle上进行测试) 有没有办法为(Firebird、Oracle和MS Sql Server)完成同样的任务 谢谢firebird上没有转换 使用CAST: 选择cast(MAX(p.end_Time)作为varchar(50))等…对于Firebird,您需要使用它来获得两个时间戳(datetime)之间的差异。顺便

我们使用firebird作为本地测试数据库,我们的大多数客户机使用SQL Server或Oracle

这适用于MS SQL Server,但不适用于Firebird。(尚未在Oracle上进行测试)

有没有办法为(Firebird、Oracle和MS Sql Server)完成同样的任务


谢谢

firebird上没有转换

使用CAST:


选择cast(MAX(p.end_Time)作为varchar(50))
等…

对于Firebird,您需要使用它来获得两个时间戳(datetime)之间的差异。顺便说一句,这是类似的。如果你想将它转换成字符,你可以使用,例如
cast(DATEDIFF(DAY,MAX(p.end\u Time),MIN(p.start\u Time))作为字符(8))
应该做这个技巧(或者你可以简单地做
cast(MAX(p.end\u Time)-MIN(p.start\u Time)作为字符(8))
因为时间戳是可以减去的

我刚刚注意到,您在
CONVERT
中指定的选项将转换为
hh:mi:ss
。Firebird中没有这样的选项。如果您需要专门转换为
hh:mi:ss
,您可能需要查看UDF库,如(特别是
F_SECONDS2PERIOD
)或者。如果所有其他操作都失败,您可以编写自己的自定义项。

在Oracle(Oracle 8i、Oracle 9i、Oracle 10g、Oracle 11g)上,您可以使用以下函数:

   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版本的链接,你使用的查询是什么;还要确保你没有添加太多大括号。我从上面复制了你的确切代码!当我使用你的替代方案时,我从StringAlway得到一个转换错误,我知道你在你的语句中没有使用AS持续时间问题是减法的结果是一个
双精度
,因此结果很可能超过8个字符,因此在转换时由于溢出而出现错误。您可能需要首先转换为
十进制
。将
视为持续时间
,我没有将其包括在内,因为它与我的答案无关。对不起,对于SQL,我是一个新手,这是错误的为什么我来这里寻求你们专家的帮助。说“我没有包括这些,因为这与我的答案无关”这对我没有帮助。我还需要十进制转换方面的帮助。虽然我感谢你的回答和帮助,但这并没有让我更进一步——因为SQL在我的两个数据库上都不起作用。你需要它出现在
hh:mi:ss
中有什么具体原因吗?正如我在上面的评论中所说的,我需要一个解决我所有数据的方法abases(Firebird、SQL Server和ORACLE)
    SELECT TO_CHAR ( SYSDATE - TO_DATE ( '18-10-2012', 'dd-mm-yyyy' ), '9,999.99' ) as duration FROM   DUAL;