为什么SQLite会隐藏存储日期后面的数据类型?

时间:2014-05-28 16:21:24

标签: datetime sqlite

SQLite没有日期时间数据类型,它允许您将日期时间值存储在现有的TEXT / REAL / INTEGER字段中。就我而言,我将日期插入INTEGER字段。据推测,SQLite将日期存储在INTEGER字段中作为单位时间戳编号。

CREATE TABLE 'test' (
    'testDate' INTEGER
);

但是,当您将日期插入INTEGER字段,然后再读取该字段时,您不会得到整数(时间戳编号)结果。您将获得刚刚插入的日期字符串。

sqlite> INSERT INTO test (testDate) VALUES ('now');
sqlite> SELECT * FROM test;
now

如果你试图假设你得到一个整数结果,并在查询中执行数学运算,你最终会得到完全不同的东西。

sqlite> SELECT testDate+1 FROM test;
1

要获取基础类型,您必须使用日期/时间函数将其转换为时间戳(或您想要的任何其他格式)。

sqlite> SELECT strftime('%s',testDate) FROM test;
1401293941

为什么SQLite在开始使用日期时会隐藏真实的数据类型?我可以得到什么证据表明SQLite在内部使用我在创建表时指定的数据类型,如果它实际上不会显示该值?

1 个答案:

答案 0 :(得分:2)

如果您输入

SELECT *, typeof(testDate) FROM test;

您可以看到它正在使用的类型。在你的情况下,"现在"存储为TEXT,而不是INTEGER。

由单引号或双引号括起的值被赋予TEXT类。

在sqlite中,您可以声明列类型。 sqlite会找出类型。使用类型声明,您可以影响变量类型,但那就是它。

以下是一个例子(取自Michael Owens的"The Definitive Guide to Sqlite"

DROP TABLE IF EXISTS test2;
CREATE TABLE test2(i int, n numeric, t text, b blob);
INSERT INTO test2 VALUES (3.142, 3.142, 3.142, 3.142);
INSERT INTO test2 VALUES ('3.142', '3.142', '3.142', '3.142');
INSERT INTO test2 VALUES (3142, 3142, 3142, 3142);
INSERT INTO test2 VALUES (NULL, NULL, NULL, NULL);
SELECT ROWID, typeof(i), typeof(n), typeof(t), typeof(b) FROM test2;

试一试。你会看到sqlite弄清楚了,但是你定义为列类型会影响结果。