在 Firebird 中创建一个整数时间戳

Posted

技术标签:

【中文标题】在 Firebird 中创建一个整数时间戳【英文标题】:Create an integer timestamp in Firebird 【发布时间】:2015-03-06 19:36:58 【问题描述】:

我需要一个整数形式的时间戳(请不要问我为什么,我完全被这个困扰了)。定义是 01.01.1970 之后的秒数。

我的初始值是一个格式为的字符串

YYYYMMDDHHMMSS(例如 20140108154821)

我已经能够建立一个正常的时间戳

CAST(
(SUBSTRING ( t.thetime FROM 5 FOR 2 )||'/'||SUBSTRING ( t.thetime FROM 7 FOR 2 )||'/'||SUBSTRING ( t.thetime FROM 1 FOR 4 )||' ' ||SUBSTRING ( t.thetime FROM 9 FOR 2 )||':'||SUBSTRING ( t.thetime FROM 11 FOR 2 )||':'||SUBSTRING ( t.thetime FROM 13 FOR 2 )||'.00'
) AS TIMESTAMP)

然后我尝试使用这种技术将其转换为 int

CAST(cast(
(SUBSTRING ( t.thetime FROM 5 FOR 2 )||'/'||SUBSTRING ( t.thetime FROM 7 FOR 2 )||'/'||SUBSTRING ( t.thetime FROM 1 FOR 4 )||' '|| SUBSTRING ( t.thetime FROM 9 FOR 2 )||':'||SUBSTRING ( t.thetime FROM 11 FOR 2 )||':'||SUBSTRING ( t.thetime FROM 13 FOR 2 )||'.00'
) AS TIMESTAMP)
-cast('01/01/1970 00:00:00' as timestamp) as BIGINT) as TIMESTAMP_INT

我确实得到了一个整数,但它看起来好像返回的值是天数或类似的东西。

例如 08.01.2015, 16:33:01.114 变为 16444

关于为什么会发生这种情况或是否有其他方法可以做到这一点的任何建议?

我使用的是 Firebird 2.5 版

提前致谢

PS:

SELECT 
CAST(cast(
    (SUBSTRING ( '20140108154821' FROM 5 FOR 2 )||'/'||SUBSTRING ( '20140108154821' FROM 7 FOR 2 )||'/'||SUBSTRING ( '20140108154821' FROM 1 FOR 4 )||' '
    ||
    SUBSTRING ( '20140108154821' FROM 9 FOR 2 )||':'||SUBSTRING ( '20140108154821' FROM 11 FOR 2 )||':'||SUBSTRING ( '20140108154821' FROM 13 FOR 2 )||'.00'
    ) AS TIMESTAMP)
    -cast('01/01/1970 00:00:00' as timestamp) as BIGINT) 
    from sometable

;

【问题讨论】:

【参考方案1】:

一种方法是使用DATEDIFF

SELECT DATEDIFF(second, TIMESTAMP'1970-01-01 00:00', CURRENT_TIMESTAMP) 
FROM RDB$DATABASE

这假定时间是 UTC,否则您可能需要偏移时区偏移量以进行补偿(例如,对于 CET (UTC+1),您将使用 TIMESTAMP'1970-01-01 01:00' 代替)。

【讨论】:

非常感谢,经过一些测试,这是对我有用的方法:)【参考方案2】:

是的,当您减去两个时间戳时,答案就是它们之间的天数。所以你要做的就是从你的时间戳中减去“大爆炸”的时间戳,然后乘以一天中的秒数,即

SELECT floor((yourTIMESTAMP - cast('1970-01-01' as TIMESTAMP)) * 86400)
FROM rdb$database

yourTIMESTAMP 替换为将字符串转换为时间戳的代码,常量86400 是每天的秒数。

【讨论】:

不,它应该可以正常工作。例如,当从“1970-01-01 12:00”中减去“1970-01-01”时,结果为 0.5(即半天 = 12 小时)。

以上是关于在 Firebird 中创建一个整数时间戳的主要内容,如果未能解决你的问题,请参考以下文章

如何记录在 Mongoose 模式中创建记录的时间戳?

在带有时间戳索引的数据框中创建一个 12 小时的循环

在 Postgres 中创建表时将空列设置为带时区的时间戳

vbscript [Excel VBA中的时间戳]在Excel VBA #Excel VBA中创建时间戳字符串

从Unix时间戳日期ios数组在Uitableview中创建动态部分?

在批处理作业中创建文件名作为时间戳