最佳答案
SQLite具有动态/灵活类型,除了rowid列的别名(INTEGER PRIMARY KEY
(带或不带AUTOINCREMENT
)或rowid列本身)之外,SQLite允许任何列保存任何存储类型的数据( 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个有效数字,
但日期/时间函数实际上会接受或多或少
代表儒略日数所必需的数字。
Time Strings
该链接立即还包括日期/时间函数及其使用示例。
考虑以下 :-
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行,第一行适合要使用的表,即name列中的文本值,其余5列中的时间戳。但是,第二行是用于演示的垃圾数据。
然后运行2个查询,第一个显示存储的数据,还有一些使用strftime函数逐步显示前一天的列。
第二个查询显示列类型。
结果是:-
请注意第二行,一列中的列类型如何不同,因此,根据数据的存储方式,每列/行都有其自己的特定类型。
概述SQLite的数据类型是灵活的,但因此可能会造成混淆,尤其是当您来自静态数据类型背景时。
关于android - 在SQLite数据库浏览器中创建时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52734105/