如何将SQLite中的当前时间戳存储为刻度?

时间:2011-05-10 20:42:14

标签: sqlite datetime iso8601

我有一个SQLite数据库,我将日期存储为刻度。我没有使用默认的ISO8601格式。假设我的表格定义如下:

CREATE TABLE TestDate (LastModifiedTime DATETIME)

使用SQL,我希望插入当前的日期和时间。如果我执行以下任何一个语句,我最终会将日期和时间存储为字符串而不是刻度。

INSERT INTO TestDate (LastModifiedTime) VALUES(CURRENT_TIMESTAMP)
INSERT INTO TestDate (LastModifiedTime) VALUES(DateTime('now'))

我查看了SQLite documenation,但我似乎没有找到任何选项来获取当前时间戳的刻度。

我当然可以在C#中定义一个参数,并将该值存储为System.DateTime。这确实导致日期时间以刻度形式存储到数据库中。

我想要做的是能够直接从SQL语句中插入和更新当前时间戳。我该怎么做?

修改

我希望数据存储为数据库中的滴答的原因是日期以与ADO.Net数据提供程序存储的格式相同的格式存储,因此当使用ADO.Net查询数据时也是如此提供者它被正确检索为System.DataTime .Net类型。

3 个答案:

答案 0 :(得分:20)

这种特殊的SQLite让我非常痛苦。

简单方法 - 以常规时间戳存储和检索

create table TestDate (
        LastModifiedTime datetime
);
insert into TestDate (LastModifiedTime) values (datetime('now'));
select datetime(LastModifiedTime), strftime('%s.%f', LastModifiedTime)  from TestDate;

输出:2011-05-10 21:34:46 | 1305063286.46.000

痛苦的方式 - 作为UNIX时间戳存储和检索

您可以使用strftime来检索刻度值。此外,要存储UNIX时间戳(大致相当于刻度),您可以用单引号括起秒数。

 insert into TestDate (LastModifiedTime) values ('1305061354');

SQLite将内部存储为非UNIX时间戳的其他值。在检索时,您需要明确告诉SQLite将其作为UNIX时间戳检索。

 select datetime(LastModifiedTime, 'unixepoch') FROM TestDate;

要存储当前日期和时间,请使用strftime('%s','now')。

 insert into TestDate (LastModifiedTime) VALUES (strftime('%s', 'now'));

完整示例:

create table TestDate (
        LastModifiedTime datetime
);      
insert into TestDate (LastModifiedTime) values (strftime('%s', 'now'));
select datetime(LastModifiedTime, 'unixepoch') from TestDate;

当由sqlite3执行时,这个脚本带有print:

2011-05-10 21:02:34 (or your current time)

答案 1 :(得分:2)

在进一步研究SQLite documentation以及日期编号转换中发现的其他信息后,我提出了以下公式,这似乎可以产生正确的结果:

INSERT INTO TestDate(LastModifiedTime)
    VALUES(CAST((((JulianDay('now', 'localtime') - 2440587.5)*86400.0) + 62135596800) * 10000000 AS BIGINT))

似乎是一种痛苦的方式来生成我希望作为内置日期时间格式提供的东西,尤其是数据库支持以刻度形式存储日期时间值。希望这对其他人也有用。

<强>更新

上述配方在夏令时方面并不完美。请参阅SQLite文档中有关本地时间计算的Caveats And Bugs部分。

答案 2 :(得分:1)

以下内容将返回自UNIX Epoch以来的毫秒数:

SELECT (strftime('%s', 'now') - strftime('%S', 'now') + strftime('%f', 'now')) * 1000 AS ticks

它的工作原理是抓住自Unix Epoch(%s )以来的秒数,减去当前时间的秒数(%S ),添加秒数带小数位%f ),并将结果乘以1000,将秒数转换为毫秒数。

减法和加法是为了增加值的精度而不会使结果偏斜。正如SQLite文档中所述,在同一步骤中'now'的所有用法都将返回相同的值。