答案 0 :(得分:0)
由于时间戳通常由Long
值表示,因此INTEGER
可以将其存储在数据库中。
答案 1 :(得分:0)
SQLite具有动态/灵活类型,除了 rowid 列(INTEGER PRIMARY KEY
(带或不带AUTOINCREMENT
)或< strong> rowid 列本身,允许任何列保存任何存储类型(TEXT,INTEGER,REAL,NULL或BLOB)的数据。
定义列后,列类型将根据一组规则(请参阅下面的链接)分解为5种列类型(列亲和力)之一,
例如即使..(mycolumn Rumplestilskin)
也是有效的,因为它已解析为 NUMERIC *的类型相似性(规则5-有关规则,请参见下面的链接)。 DECIMAL
,DECIMAL(10,5)
也会下降到规则5,因此导致类型相似性为** NUMERIC 。
上面是Datatypes In SQLite Version 3
的概述因此,除了考虑类型相似性对提取时对数据的影响之外,列类型并不是真正的因素。
重要的是存储的实际数据。
对于日期/时间戳,最好将数据存储为可接受的时间字符串之一:-
时间字符串可以采用以下任何格式:
YYYY-MM-DD YYYY-MM-DD HH:MM YYYY-MM-DD HH:MM:SS YYYY-MM-DD HH:MM:SS.SSS YYYY-MM-DDTHH:MM YYYY-MM-DDTHH:MM:SS YYYY-MM-DDTHH:MM:SS.SSS HH:MM HH:MM:SS HH:MM:SS.SSS now DDDDDDDDDD
在格式5到7中,“ T”是一个文字字符,用于分隔 日期和时间,符合ISO-8601的要求。
格式化8到10 仅指定时间,假设日期为2000-01-01。
格式11,字符串 “现在”转换为从中获取的当前日期和时间 使用的sqlite3_vfs对象的xCurrentTime方法。 “现在” 日期和时间函数的参数始终返回完全相同的参数 同一sqlite3_step()调用中多个调用的值。 使用世界标准时间(UTC)。
格式12是儒略日 数字表示为浮点值。
格式2到10后面可以有一个时区 指标的形式为“ [+-] HH:MM”或“ Z”。日期和时间 函数内部使用UTC或“ zulu”时间,因此后缀“ Z”为 一个没有人。从指示的值中减去任何非零的“ HH:MM”后缀 日期和时间以计算祖鲁时间。例如,所有 以下时间字符串是等效的:
2013-10-07 08:23:19.120 2013-10-07T08:23:19.120Z 2013-10-07 04:23:19.120-04:00 2456572.84952685
在格式4、7和10中,小数秒数值SS.SSS可以具有 小数点后的一位或多位数字。 示例中仅显示了三位数,因为只有前三位数是 对结果有意义,但是输入字符串可以具有更少或更多 超过三位数,日期/时间功能仍将运行 正确地。
同样,格式12显示为10个有效数字, 但日期/时间函数实际上会接受或多或少 表示儒略日编号所必需的数字。
该链接立即还包括日期/时间函数及其使用示例。
请考虑以下内容:-
DROP TABLE IF EXISTS savetimestamps;
CREATE TABLE IF NOT EXISTS savetimestamps (
name TEXT,
ts01 rumplestiltskin DEFAULT CURRENT_TIMESTAMP,
ts02 INTEGER DEFAULT CURRENT_TIMESTAMP,
ts03 myreallybigintbutrealllyitisjustandint DEFAULT CURRENT_TIMESTAMP,
ts04 BLOB DEFAULT CURRENT_TIMESTAMP,
ts05 REAL DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO savetimestamps (name) VALUES('A');
INSERT INTO savetimestamps VALUES(1,'a',3.725,4,5,x'010203040506070809'); -- useless/confusing data
SELECT *,
rowid AS id,
STRFTIME('%d %M %Y', ts01) AS t1,
STRFTIME('%d %M %Y', ts02, '-1 DAYS') AS t2,
STRFTIME('%d %M %Y', ts03, '-2 DAYS') AS t3,
STRFTIME('%d %M %Y', ts04, '-3 DAYS') AS t4,
STRFTIME('%d %M %Y', ts05, '-4 DAYS') AS t5
FROM savetimestamps;
SELECT
name,typeof(ts01),typeof(ts02),typeof(ts03),typeof(ts04),typeof(ts05)
FROM savetimestamps;
这将创建一个具有6列或不同列类型关联性的表(TEXT,NUMERIC(规则5)INTEGER,INTEGER(规则1,因为它包含int),BLOB和REAL)。
最后5列具有当前时间戳的默认值,因此SQLite插入当前时间戳不会提供该值。
在第一行中插入2行,这些行适合要使用的表,即名称列中的文本值,其余5行中包含时间戳。但是,第二行是用于演示的垃圾数据。
然后运行2个查询,第一个显示存储的数据,还有一些使用strftime函数逐步显示前一天的列。
第二个查询显示列类型。
结果是:-
作为概述,SQLite的数据类型很灵活,但结果可能会造成混淆,尤其是当您来自静态数据类型背景时。