在SQLite数据库浏览器中创建时间戳

时间:2018-10-10 06:40:21

标签: android sqlite android-sqlite

我正在将DB Browser用于SQLite,而我对此还很陌生。我正在寻找属性的时间戳类型。换句话说,时间戳是真实的吗?

enter image description here

我已经编辑了类型及其默认的先生。这种权利吗?

enter image description here

2 个答案:

答案 0 :(得分:0)

由于时间戳通常由Long值表示,因此INTEGER可以将其存储在数据库中。

答案 1 :(得分:0)

SQLite具有动态/灵活类型,除了 rowid 列(INTEGER PRIMARY KEY(带或不带AUTOINCREMENT)或< strong> rowid 列本身,允许任何列保存任何存储类型(TEXT,INTEGER,REAL,NULL或BLOB)的数据。

定义列后,列类型将根据一组规则(请参阅下面的链接)分解为5种列类型(列亲和力)之一,

例如即使..(mycolumn Rumplestilskin)也是有效的,因为它已解析为 NUMERIC *的类型相似性(规则5-有关规则,请参见下面的链接)。 DECIMALDECIMAL(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行,这些行适合要使用的表,即名称列中的文本值,其余5行中包含时间戳。但是,第二行是用于演示的垃圾数据。

然后运行2个查询,第一个显示存储的数据,还有一些使用strftime函数逐步显示前一天的列。

第二个查询显示列类型。

结果是:-

enter image description here

enter image description here

  • 请注意第二行,一列中的列类型如何不同,因此,根据数据的存储方式,每列/行都有其自己的特定类型。

作为概述,SQLite的数据类型很灵活,但结果可能会造成混淆,尤其是当您来自静态数据类型背景时。