为什么SQLiteStudio(和其他)默认情况下不以人类可读的格式显示日期时间?

时间:2014-09-19 13:50:05

标签: sql sqlite datetime sqlitestudio

今天我第一次使用SQLite数据库,我真的很想知道DATETIME列的显示情况如1411111200。当然,在内部它必须存储为一些整数值才能用它来进行数学运算。但谁愿意在网格输出中看到这一点,这对于人类来说是显而易见的呢?

我甚至尝试了两个程序,SQLiteStudio和SQLite Manager,两者都没有选择更改它(至少我找不到它)。

当然,根据我对SQL的了解,不需要花很长时间才能找出值的含义 - 这个查询会像我预期的那样显示它:

select datetime(timestamp, 'unixepoch', 'localtime'), * from MyTable

但是使用GUI工具时非常不舒服。所以为什么?只是因为? Unix书呆子?或者我只是得到一个错误的印象,因为我不小心尝试了唯一的2个不好的工具?

(我也很欣赏有关使用哪些工具或我可以找到隐藏设置的评论。)

2 个答案:

答案 0 :(得分:2)

可能是因为sqlite doesn't have a first-class date type - GUI工具如何知道哪些列应该包含日期?

答案 1 :(得分:1)

这个问题意味着数据类型DATETIME的列只能保存有效的日期时间。但是在SQLite中并非如此:你可以输入任何数字或字符串值,它将被存储和显示。

为了找出SQLite中时间戳最“自然”的方式,我创建了一个这样的表:

CREATE TABLE test ( timestamp DATETIME DEFAULT ( CURRENT_TIMESTAMP ) );

结果是以人类可读格式(2014-09-22 10:56:07)显示!但事实上它被保存为字符串,我无法想象任何认真的软件开发人员。有什么意见吗?

该问题的原始数据库,日期时间为unixepoch,不是因为它的表定义,而是因为插入的数据就是这样。这可能是最好的选择。

因此,答案是,这些工具无法以人类可读的格式显示日期时间,因为他们无法知道它是如何编码的。它可以是自1970年以来的秒数或其他任何东西,甚至可能在行与行之间有所不同。真是一团糟。

来自Wikipedia

  

一个常见的批评是SQLite的类型系统缺乏数据   由其他的静态类型列提供的完整性机制   产品。 [...]但是,它可以通过约束来实现   比如CHECK(typeof(x)='integer')。

来自the authors

  

[...]大多数其他SQL数据库引擎都是静态类型的,所以有些   人们觉得使用清单打字是SQLite中的一个错误。但   SQLite的作者非常强烈地感到这是一个功能。该   在SQLite中使用清单类型是一个深思熟虑的设计决策   已经在实践中证明了SQLite更可靠,更易于使用,   特别是与动态类型编程结合使用时   语言,如Tcl和Python。