2011-05-10 55 views
11

我有一个SQLite数据库,我把日期存储为tick。我没有使用默认的ISO8601格式。比方说,我有一个表定义如下:如何将当前时间戳存储在SQLite中作为刻度?

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类型正确检索。

+0

THX,插入当前时间戳到数据库中只需添加---> DATETIME(“现在”) – user956584 2012-11-01 14:41:10

回答

2

的日期数字的转换发现SQLite documentation等信息的进一步研究后,我已经拿出下面的公式,这似乎产生了正确的结果:

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

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

更新:

上述公式是不完美的,当涉及到夏令时。请参阅SQLite文档中有关本地时间计算的部分Caveats And Bugs

+1

您的公式不正确,因为它没有考虑到夏时制时间的变化。 NTFS中的LastModifiedTime元数据存储为UTC,因此您的转换有一个错误。 – JasDev 2011-05-30 12:04:28

+0

这是真的。我添加了一个关于当地时间计算的笔记。你对改善配方有什么建议吗? – Elan 2011-05-30 21:52:26

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检索tick中的值。此外,要存储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) 
+0

似乎从简单的方法输出时间戳不合法的一对夫妇的原因 - 它有一个额外的小数点,它有时钟秒夹在纪元秒和毫秒之间。出于我的目的,我需要比较'现在'和已经存储在数据库中的时间戳(以毫秒为单位),而不是小数秒。但毫秒精度并不重要,所以我最终使用'strftime('%s000','now')'代替。 – spaaarky21 2013-09-06 21:47:56

1

下将返回的毫秒数自Unix纪元:

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

它通过抓取的自Unix纪元秒数(%S),减去的秒数当前时间(%S),加上小数位数%f),并将结果乘以1000以将秒数转换为毫秒。

减法和加法是为数值添加精度而不会影响结果。正如SQLite文档中所述,在同一步骤中'now'的所有用法将返回相同的值。