sqlite - 将日期时间转换为日期时,为什么 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 对我来说出乎意料的行为的技术解释是什么?
解决方案
对于 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 的子字符串-
,也就是年份。
推荐阅读
- java - 在 Android Studio 上同步新项目时出现 Firebase 错误(ASCII 错误)
- azure-active-directory - 无法访问 /me/drive/root/children(也无法访问任何 driveItem 对象)
- android - 如何在房间迁移语句中使用 Kotlin 字符串模板
- validation - Salesforce - 验证规则 (RegEX)
- java - 从屏幕修改时如何自动加载 Spring Security
- linkedin - Linkedin 身份验证问题 - 访问权限不足:GET /people/~:
- hyperledger-fabric - 超级账本结构:同一组织中的同行尝试使用错误的地址来设置链码监听地址
- vue.js - 当我调用 created() 钩子时未定义的 mapState 组件
- ios - iOS:如何计算两个日期之间的毫秒数
- android - 如何将以下json数据保存到两个表(模型表和变体表)中,并根据模型获取数据