SQLite中的datetime类型列是什么?

SQLite中的datetime类型列是什么?,sqlite,datetime,Sqlite,Datetime,我必须在与库交互并创建由库操作的表的地方做一些工作。我需要能够创建其他程序不知道自己没有创建的表 在查看一些模式并了解它是如何创建东西的时候,我注意到了一些奇怪的事情。当我读到这篇文章时,我发现它是一个小列表,在我看来,如果我想存储日期/时间,我需要确保在选择/插入/更新查询中使用特殊函数,并且列可以是文本、整数或实数。如果我忘记了某个datetime()函数,我希望得到的不是我想要的(除了一个文本列) 我正在查看其中一个表的模式,我在列中看到: "LastUpdated" datetime ,

我必须在与库交互并创建由库操作的表的地方做一些工作。我需要能够创建其他程序不知道自己没有创建的表

在查看一些模式并了解它是如何创建东西的时候,我注意到了一些奇怪的事情。当我读到这篇文章时,我发现它是一个小列表,在我看来,如果我想存储日期/时间,我需要确保在选择/插入/更新查询中使用特殊函数,并且列可以是文本、整数或实数。如果我忘记了某个datetime()函数,我希望得到的不是我想要的(除了一个文本列)

我正在查看其中一个表的模式,我在列中看到:

"LastUpdated" datetime ,
嗯,好的datetime不是一种类型。还是这样?“类型关联”规则表明“datetime”是有效的类型说明符,将被视为数字。好吧,没什么。我尝试一个查询:

sqlite> select datetime(LastUpdated) from Foo;
2016-01-06 15:37:36
这是有道理的。我打赌如果我忘记了datetime()函数,我会得到一些愚蠢的结果,对吗

sqlite> select datetime(LastUpdated) from DestinationAdapter;
2016-01-06 15:37:36
嗯。。。好啊如果它是一个文本专栏,我想这是有道理的。所以我做了一个测试表:

sqlite> CREATE TABLE TestDateTime ( 
   ...>   "Id" integer primary key autoincrement not null,
   ...>   "Value" TEXT,
   ...>   "ValueN" NUMERIC);
sqlite> INSERT INTO TestDateTime(Value, ValueN) VALUES (datetime('2015-01-06 10:20:30'), datetime('2015-01-06 10:20:30'));
sqlite> select * from TestDateTime;
1|2015-01-06 10:20:30|2015-01-06 10:20:30

嗯。这越来越奇怪了。似乎SQLite存储的内容不是数据类型文档中讨论的值。不管它是什么,它都会告诉SQLite的控制台工具,列中的值是日期/时间值,并且应该这样显示。那么到底发生了什么?似乎无论我给一个列指定什么类型,日期和时间都是“正常的”。这太神奇了,让我觉得不舒服。这里到底发生了什么,以及它应该如何影响我编写涉及日期/时间值的查询?

因为您试图将文本存储到数字字段中,它只是将其存储为文本。它既不存储datetime值,也不知道存储的是datetime,它只是存储由
datetime()
函数返回的字符串

从您链接的文档中:(强调我的)

2.0类型亲缘关系

为了最大限度地提高SQLite和其他数据库之间的兼容性 引擎,SQLite支持列上的“类型关联”概念。 列的类型关联是存储数据的建议类型 在那个专栏里这里的重要思想是类型是 推荐,不需要。任何列仍然可以存储任何类型的 数据。只是有些栏目,如果有选择的话,会更喜欢 将一个存储类用于另一个存储类。的首选存储类 列称为其“关联”

具有数值相关性的列可能包含使用所有五个存储类的值。将文本数据插入数值列时, 文本的存储类被转换为整数或实数(在 优先顺序),如果这种转换是无损和可逆的。 对于文本和实存储类之间的转换,SQLite 将转换视为无损且可逆的,前提是 保留数字的有效小数位数如果 将文本无损转换为整数或实数是不可能的 使用文本存储类存储该值。未进行任何尝试 转换空值或BLOB值


好的,这是有意义的,除了它让我问这样一个问题,“那么datetime()函数到底是做什么的,我能不能先在列中插入字符串?”哦。等待这个问题的答案类似于“在插入查询中不使用datetime()”@OwenP
datetime()
是一个格式化函数,而不是转换函数。所以,当您想要将要传递的任何值转换为日期和时间的特定字符串表示形式时,可以使用它。只是在控制台上做了更多的测试。datetime()和其他函数总是输出一个字符串,它们尝试将输入解释为日期/时间,然后以单一格式输出字符串。就列而言,TEXT/INTEGER/REAL stuff定义了3种可接受的输入格式,除非使用strftime()来支持其他一些字符串格式。