11

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

CREATE TABLE TestDate (LastModifiedTime DATETIME)

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

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

我查看了SQLite 文档,但我似乎没有找到任何选项来获取当前时间戳(以刻度为单位)。

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

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

编辑:

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

4

3 回答 3

21

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 执行时,此脚本打印:

2011-05-10 21:02:34 (or your current time)
于 2011-05-10T20:56:21.347 回答
3

在进一步研究了SQLite 文档和有关日期数字转换的其他信息后,我提出了以下公式,它似乎产生了正确的结果:

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

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

更新:

上述公式在夏令时方面并不完美。请参阅SQLite 文档中有关本地时间计算的警告和错误部分。

于 2011-05-11T19:16:21.630 回答
1

以下将返回自 UNIX 纪元以来的毫秒数:

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

它的工作原理是获取自 Unix 纪元 ( %s ) 以来的秒数,减去当前时间的秒数 ( %S ),加上带小数位的秒数( %f ),然后将结果乘以 1000从秒转换为毫秒。

减法和加法是为了在不扭曲结果的情况下增加值的精度。如 SQLite 文档中所述,在同一步骤中对“现在”的所有使用都将返回相同的值。

于 2013-12-09T18:51:19.130 回答