2016-01-06 58 views
1

我不得不做一些工作,我正在与之交互并创建由SQLite.net库操纵的表格。我需要能够创建表,其他程序不会知道它没有创建它自己。什么是SQLite中的datetime-type列?

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

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

"LastUpdated" datetime , 

呃,好的。 '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的控制台工具,该列中的值是日期/时间值,应该按照这样的方式呈现。那么究竟发生了什么?看起来无论我分配给列的日期和时间是“正常工作”。这太神奇了,让我感到舒服。这里发生了什么,以及它如何影响我如何编写涉及日期/时间值的查询?

回答

3

因为您试图将文本存储到NUMERIC字段中,所以它只是将其存储为文本。它不存储日期时间价值,也不知道它的存储日期时间,它只是存储由datetime()功能

返回从你链接的文档字符串:(重点煤矿)

2.0类型亲和力

为了最大限度地提高SQLite和其他数据库引擎之间的兼容性,SQLite支持列上的“type affinity”概念。 列中的类型亲和性是该列中存储的数据 的推荐类型。 这里的重要想法是推荐使用 ,不是必需的。 任何列都可以存储任何类型的 数据。只是有些列在给出选择的情况下会更愿意使用 来使用一个存储类而不是另一个。 列的首选存储类称为其“亲和性”。

具有NUMERIC关联性的列可能包含使用全部五个存储类的值。将文本数据插入NUMERIC列 时,如果此类转换是无损和可逆的,则文本的存储类将转换为INTEGER或REAL(以 的优先顺序)。 对于TEXT和REAL存储类之间的转换,SQLite 认为转换是无损和可逆的,如果保留数字的前15位数。 如果无法将TEXT无损转换为INTEGER或REAL,则 值将使用TEXT存储类存储。没有尝试将 转换为NULL或BLOB值。

+0

好吧,这是有道理的,除了它让我问这个问题,“那么datetime()函数究竟是什么,难道我不能仅仅在列中敲击字符串? – OwenP

+0

哦。等待。是这样的答案:“你不在INSERT查询中使用datetime()”? – OwenP

+1

@OwenP'datetime()'是格式化函数,不是转换函数。所以当你想将你传递的任何值转换成日期和时间的特定字符串表示时,你可以使用它。 –

相关问题