首页 > 解决方案 > 将日期时间转换为日期时,为什么 SQLite3 只返回年份而不返回完整日期?

问题描述

我知道您可以使用date() 函数将日期时间转换为日期:

sqlite> select date('2000-01-01 10:00:00');
2000-01-01

但是为什么SQLite3 的强制转换表达式如 in

sqlite> select cast('2000-01-01 10:00:00' as date);
2000

只返回年份?

即使使用显式 datetime() 设置也只返回年份:

sqlite> select cast(datetime('2000-01-01 10:00:00') as date);
2000

或者:

sqlite> select cast(datetime('now') as date);
2019

查看 Postgresql,它可以正确解决这两个问题:

postgresql> select date('2000-01-01 10:00:00');
2000-01-01

postgresql> select cast('2000-01-01 10:00:00' as date);
2000-01-01

SQLite3 对我来说出乎意料的行为的技术解释是什么?

标签: sqlitedatedatetimecastingtype-conversion

解决方案


对于 SQLite,没有Date数据类型。正如他们在此处的文档中所述:https ://www.sqlite.org/datatype3.html

你实际使用的Date是什么TEXT

您可以检查:

select typeof(datetime('now'));

返回:

text

和:

select typeof(cast(datetime('now') as date));

返回:

integer

所以结果cast('2000-01-01 10:00:00' as date)是一个整数,它与你得到的整数相同:

select '2000-01-01 10:00:00' + 0

当 SQLite 隐式转换'2000-01-01 10:00:00'2000以便在数学运算中使用它时。
在日期的情况下,它恰好是年份的数值,但通常 SQLite 返回 TEXT 的最长子字符串,从第一个字符开始,可以表示为整数。
所以'2000-01-01 10:00:00'它是直到 1st 的子字符串-,也就是年份。


推荐阅读