SQLite中的datetime-type列是什么?

时间:2016-01-06 19:21:43

标签: sqlite datetime

我必须做一些与我交互的工作,并创建由SQLite.net库操纵的表。我需要能够创建其他程序不会知道它没有创建自己的表格。

在看一些模式并了解它是如何创造事物时,我注意到一些奇怪的事情。当我读到SQLite's data types时,我发现它是一个小清单,最初它看起来像我想要存储一个日期/时间我需要确保我在SELECT / INSERT中使用特殊功能/ UPDATE查询,列可以是TEXT或INTEGER或REAL。如果我在某个地方忘记了datetime()函数,我希望得到的东西不是我想要的东西(可能是一个TEXT列。)

所以,我正在查看其中一个表的架构,我在列中看到了这一点:

"LastUpdated" datetime ,
好的,好的。 '日期时间'不属于某种类型。或者是吗? '类型亲和力'规则表明' datetime'是一个有效的类型说明符,将被视为NUMERIC。好的,没有什么真的在那里。我尝试了一个查询:

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
呃......好的。我想,如果它是一个TEXT专栏,这是有道理的。所以我做了一个测试表:

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的控制台工具列中的值是日期/时间值,并且应该如此呈现。到底是怎么回事?似乎无论我为列分配什么类型,日期和时间都只是工作'。这太神奇了,不能让我感到舒服。这里真正发生了什么,它应该如何影响我编写涉及日期/时间值的查询?

1 个答案:

答案 0 :(得分:3)

因为您尝试将文本存储到NUMERIC字段中,所以它只是将其存储为文本。它不存储日期时间值,也不知道存储日期时间,它只是存储datetime()函数返回的字符串

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

  

2.0类型亲和力

     

为了最大化SQLite与其他数据库之间的兼容性   SQLite支持列上的“类型亲和力”概念。   列的类型亲缘关系是存储数据的推荐类型   在那一栏。 这里的重要思想是类型   推荐,不是必需的。 任何列仍然可以存储任何类型的   数据。 只是选择的某些列会更喜欢   使用一个存储类而不是另一个。首选的存储类   一列被称为“亲和力”。

     

     

具有NUMERIC亲缘关系的列可能包含使用所有五个存储类的值。当文本数据插入NUMERIC列时,   文本的存储类转换为INTEGER或REAL(in   优先顺序)如果这种转换是无损和可逆的。   对于TEXT和REAL存储类之间的转换,SQLite   如果前15个,则认为转换是无损且可逆的   保留该数字的有效十进制数字。 如果   无法将TEXT无损转换为INTEGER或REAL   使用TEXT存储类存储该值。不尝试   转换NULL或BLOB值。