[英]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.