我想在 Firebird 上获得 unix 时间

Ric*_*sit 3 firebird

我想在 firebird 中获取类似于 Javascript 上的 GetTime 的时间,我已经创建了一个,但每天的时差增量并不那么准确

CREATE PROCEDURE GETTIMEINMILLISECONDS
RETURNS (
  MILL VARCHAR(50)
)
AS
  DECLARE VARIABLE VAR_PARAM INTEGER;
BEGIN
select
(((extract(year from current_timestamp)
  -extract(year from cast('01/01/1970 00:00:00' as timestamp))) *  31536000000) +
(extract(month from current_timestamp) * 2592000000) +
(extract(day from current_timestamp)   *  8640000) +
(extract(Hour from current_timestamp)   * 3600000) +
 (extract(minute from current_timestamp) * 60000) +
  (extract(second from current_timestamp) * 1000))-192960000
  from rdb$database  into :Mill;
  suspend;
END
;
Run Code Online (Sandbox Code Playgroud)

Mar*_*eel 5

在 Firebird 2.1 及更高版本上,您可以使用

select DATEDIFF(second, timestamp '1/1/1970 00:00:00', current_timestamp)
from rdb$database
Run Code Online (Sandbox Code Playgroud)

对于早期版本,您可以使用 FreeAdhocUDF 中的 UDF F_AGEINSECONDS:

select F_AGEINSECONDS('1/1/1970 00:00:00', current_timestamp) from
rdb$database
Run Code Online (Sandbox Code Playgroud)

请参阅回复:[firebird-support] 如何将 TIMESTAMP 转换为 unix 时间戳(自纪元以来的秒数)

如果您不是 GMT,则需要通过将时区偏移添加到时间戳来考虑您当前的时区。例如,对于 CEST (+2:00),您将需要使用:

select DATEDIFF(second, timestamp '1970-01-01 02:00:00', current_timestamp)
from rdb$database
Run Code Online (Sandbox Code Playgroud)

(注意我在这里切换到 ISO-8601 日期格式)

在 Firebird 4.0 中,您可以通过使用文字来避免这种更正TIMESTAMP WITH TIME ZONE

select DATEDIFF(second, timestamp '1970-01-01 00:00:00 UTC', current_timestamp)
from rdb$database
Run Code Online (Sandbox Code Playgroud)