gpt4 book ai didi

datetime - 为什么 SQLite 将数据类型隐藏在存储的日期后面?

转载 作者:行者123 更新时间:2023-12-02 10:26:32 25 4
gpt4 key购买 nike

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 实际上不会向我显示该值,我能得到什么证据来证明 SQLite 在内部使用我创建表时指定的数据类型?

最佳答案

如果您输入

SELECT *, typeof(testDate) FROM test;

您可以看到它正在使用的类型。在您的情况下,“现在”存储为文本,而不是整数。

用单引号或双引号括起来的值被指定为 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 能够解决这个问题,但是您定义的列类型会影响结果。

关于datetime - 为什么 SQLite 将数据类型隐藏在存储的日期后面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23916982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com