我在表中有一个时间列,它应该表示时间(在服务器上),以及创建记录时Epoch以来的毫秒数。
但是,strftime("%s")
返回一个整数,省略毫秒值。
strftime("%f")
显示相对于当前分钟的第二个值,以及与分钟的第二个和纪元同步的毫秒值。
所以看来我可以使用这个相当复杂的陈述来获得我想要的价值:
select CAST(strftime('%s','now') || '.' || substr(strftime('%f','now'),4,3) AS REAL)
这可靠吗?我主要担心的是,我必须两次调用strftime()
,第二个值可能会在调用之间推进,以便在得到4.999
时得到(例如)3.999
}?我可以想象也许创建一个临时表来存储strftime("%f %s")
的结果,然后取两个单独选择的substr
,但这更复杂,我不确定是否有必要(是SQLite足够聪明,只能调用strftime()
一次并返回相同的结果两次?)有更好的方法吗?
答案 0 :(得分:2)
很安全。来自documentation,
The 'now' argument to date and time functions always returns
exactly the same value for multiple invocations within the same
sqlite3_step() call.
可以使用以下查询验证:
WITH RECURSIVE cnt(x,y) AS (
SELECT 1,1
UNION ALL
SELECT
x+1,
CAST(strftime('%s','now') || '.' || substr(strftime('%f','now'),4,3) AS REAL)
FROM cnt
LIMIT 10000)
SELECT x,y FROM cnt;
在我的机器上,此查询需要40毫秒,但所有时间值都相同。