【问题标题】:SQLite Current Timestamp with Milliseconds?以毫秒为单位的 SQLite 当前时间戳?
【发布时间】:2013-07-10 15:29:13
【问题描述】:

我在 SQLite3 列中将时间戳字段存储为TIMESTAMP DATETIME DEFAULT CURRENT_TIMESTAMP,我想知道是否有任何方法可以在时间戳中包含毫秒?

【问题讨论】:

  • TIMESTAMP 是自 1970 年 1 月 1 日以来经过的秒数,所以猜测您将需要另一个字段来表示毫秒
  • POSIX 时间定义为自 1970 年 1 月 1 日午夜 UTC 以来经过的毫秒数。我会说,只要您确定它是 POSIX 时间(即 UTC 时间),就可以使用毫秒作为时间戳。否则,本地时间戳使用毫秒是非常不寻常的,您应该使用其他数字时间格式。见:stackoverflow.com/questions/32670064/…

标签: sql sqlite


【解决方案1】:

使用(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')) 代替CURRENT_TIMESTAMP,这样您的列定义变为:

TIMESTAMP DATETIME DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW'))

例如:

CREATE TABLE IF NOT EXISTS event
(when_ts DATETIME DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')));

【讨论】:

  • Oracle 背景的%f 本身看起来很奇怪,它与Oracle 的TO_DATE(... SS.FFF') 相同
【解决方案2】:

要获取自纪元以来的毫秒数,您可以使用julianday() 进行一些额外的计算:

-- Julian time to Epoch MS     
SELECT CAST((julianday('now') - 2440587.5)*86400000 AS INTEGER); 

【讨论】:

  • 我希望有一种更直观的方式。
  • 添加 ROUND 以获得更准确的千分之一:CAST(ROUND((julianday('now') - 2440587.5)*86400000) As INTEGER)
【解决方案3】:

以下方法不需要任何乘法或除法,并且应始终产生正确的结果,因为在单个查询中多次调用 get 'now' 应始终返回相同的结果:

SELECT strftime('%s','now') || substr(strftime('%f','now'),4);

生成秒数并将其连接到当前秒+毫秒的毫秒部分。

【讨论】:

  • 这很好用,是我自己生成时间戳并通过字符串格式化程序插入值的绝佳选择。
【解决方案4】:

这是一个查询,它将生成一个时间戳为毫秒的字符串:

 select strftime("%Y-%m-%d %H:%M:%f", "now"); 

如果你真的很想使用数字表示,你可以使用:

select julianday("now"); 

【讨论】:

  • fyi,julianday() 不能与任何基于纪元时间的事物(无论是秒还是毫秒)进行原生比较。您必须在代码中的任何位置进行转换。
猜你喜欢
  • 2015-09-22
  • 2010-10-02
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 2011-08-02
  • 1970-01-01
相关资源
最近更新 更多