繁体   English   中英

C ++和Sqlite3:如何以毫秒精度存储日期/时间

[英]C++ and Sqlite3: How to store date/time with milliseconds precision

我正在构建一个将在Ubuntu中运行的C ++应用程序,并将Sqlite3用作数据库。

我的目标之一是拥有一个包含时间/日期字段的C ++类,然后将其存储在数据库中。

过去,我在类中使用time_t作为变量类型,并将它们作为INTEGER类型存储在Sqlite3中,例如:

C ++类:

class MyClass {

        time_t dateTimeInfo;
}

SQLITE3:

CREATE TABLE MYCLASS (....., INTEGER DATETIMEINFO, ...);

这种方法使我可以SELECT具有不同比较运算符( >, >=, < , <=, == )的SELECT时间,完全没有问题,因为我正在处理简单数字。 在用户级别, time_t转换为ISO 8601 std::string´s因此我可以拥有一个人类可读的界面。

除了不支持millisecods之外, 非常有效。 在我当前的项目中,我需要支持他们,因此需要对此进行更改。

就我所学的知识而言,我需要使用std::chrono::time_point作为类类型,如下所示:

C ++类:

class MyClass {

        std::chrono::time_point dateTimeInfo;
}

但是我真的不知道在Sqlite3中使用哪种数据类型,以及它是否能像time_t一样工作。

SQLITE3:

CREATE TABLE MYCLASS (....., ???? DATETIMEINFO, ...);

我的问题:

a) std::chrono::time_point在这里是正确的选项吗?

b)什么是Sqlite3类型等效项? 还是INTEGER

c)本是推荐的方法(无boost请,C ++ 11)?

感谢您的帮助。

您可以将ISO 8601字符串的格式化时间直接存储为TEXT 例如,您可以制作下表:

CREATE TABLE tbl(name TEXT, ts TEXT);

以毫秒值插入ISO 8601格式的字符串作为文本字符串:

INSERT INTO tbl VALUES ('first', '2015-07-06T10:59:46.1234Z');
INSERT INTO tbl VALUES ('second', '2015-07-06T10:59:47.5678Z');
INSERT INTO tbl VALUES ('third', '2015-07-06T10:59:48.9012Z');

此时,您可以使用比较运算符查询它们:

SELECT * FROM tbl WHERE ts <= '2015-07-06T10:59:46.1233Z';
// Returns nothing
SELECT * FROM tbl WHERE ts <= '2015-07-06T10:59:46.1234Z';
// Returns the first record
SELECT * FROM tbl WHERE ts > '2015-07-06T10:59:46.1234Z';
// Returns the last two records

作为额外的好处,当您与此数据库进行交互时,您将获得ISO 8601格式的输出,无论如何,这都是您在客户端执行的操作。

此方法利用以下事实:在时区中,字符串的字典顺序产生语义上正确的日期时间顺序。 如果您的使用方案涉及多个时区,则使用单个时区(例如UTC时间)在数据库中进行存储将有助于保留此排序属性。

是的, std::chrono是一种非常好的方法(内部为C ++)。 您可以使用std::chrono将时间点从/转换为毫秒,如下所示:

using namespace std::chrono;

typedef time_point<system_clock, milliseconds> time_points_millis;

time_points_millis tp = system_clock::now();

// An at least 43 bit signed integral type
auto epoch = tp.time_since_epoch();

在这种情况下,您应该使用64位整数类型将其与SQLite一起存储,因为数据可能超过32位。

评论:到目前为止,我对SQLite的了解并不多,但是我发现这适用于64位类型: Official docs

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM