SQLite 并不提供专用的 DATE
或 TIME
数据类型,但它拥有强大的内建函数,允许你以灵活的方式处理时间字符串、时间戳与格式化输出。掌握这些特性对于日志记录、定时统计、事件触发等场景至关重要。
📚 目录
- SQLite 日期与时间的存储方式
- SQLite 核心时间函数总览
- 日期格式的转换与输出
- 时区与 UTC 处理策略
- 常见的时间计算案例
- 日期字段在实际开发中的应用建议
- 出站资源与站内推荐阅读
- 参考资料
1. 日期与时间的存储方式
SQLite 支持三种时间数据存储格式:
类型 | 示例 | 描述 |
---|---|---|
TEXT | '2025-04-09 15:30:00' | 可读性好,推荐 |
REAL | 2459580.14583 | Julian 日(不推荐) |
INTEGER | 1712665800 | Unix 时间戳(精确、适合排序) |
👉 SQLite 不强制使用 DATE
或 DATETIME
类型,但你可以在表结构中定义为 TEXT
或 INTEGER
类型并自行转换。
2. 核心时间函数总览
SQLite 提供多个内置函数处理时间相关操作:
函数名 | 描述 |
---|---|
date(timestring, modifier, ...) | 返回日期(不含时间) |
time(timestring, modifier, ...) | 返回时间(不含日期) |
datetime(timestring, modifier, ...) | 返回完整时间戳 |
julianday(...) | 转换为 Julian 日期 |
strftime(format, timestring, ...) | 自定义格式输出 |
current_date / current_time / current_timestamp | 当前日期/时间 |
示例:
SELECT datetime('now');
-- 输出:2025-04-09 13:45:00
SELECT date('now', '-7 day');
-- 输出:2025-04-02
3. 日期格式的转换与输出
使用 strftime()
可以输出任何自定义格式:
SELECT strftime('%Y/%m/%d %H:%M:%S', 'now');
-- 输出:2025/04/09 13:45:00
常用格式化符号:
符号 | 含义 |
---|---|
%Y | 年(四位) |
%m | 月(两位) |
%d | 日 |
%H | 小时 |
%M | 分钟 |
%S | 秒 |
4. 时区与 UTC 处理策略
SQLite 所有基于 'now'
的函数默认返回 UTC 时间。
转为本地时间(东八区):
SELECT datetime('now', 'localtime');
存 UTC,取出时本地转换(推荐):
INSERT INTO logs(created_at) VALUES(datetime('now'));
SELECT datetime(created_at, 'localtime') FROM logs;
5. 常见时间计算场景
计算某日期之后 30 天:
SELECT date('2025-04-09', '+30 days');
获取上个月的今天:
SELECT date('now', '-1 month');
判断是否超过 24 小时未登录:
SELECT user_id FROM users
WHERE last_login < datetime('now', '-1 day');
6. 日期字段在实际开发中的建议
- 建议统一使用
TEXT
格式存储datetime
,便于兼容性和调试 - 写入时使用 UTC:
datetime('now')
- 读取时转换本地时间:
'localtime'
修饰符 - 查询/排序时尽量使用 ISO 标准格式(
yyyy-MM-dd HH:mm:ss
) - 使用索引字段时避免
strftime()
包裹字段,这会导致索引失效
7. 🔗 出站参考与站内推荐阅读
外部资源:
推荐文章(站内):
8. 📚 参考资料
- SQLite 日期函数手册:https://www.sqlite.org/lang_datefunc.html
- 《SQLite 权威指南》时间处理章节
- Stack Overflow 高赞答案:https://stackoverflow.com/questions/3471206
- SQLite 源码中对
date.c
的实现解析 - Unix timestamp vs ISO 格式比较研究
✅ 下一篇为终章之一:《SQLite 常用函数大全:数值、字符串、聚合函数全面指南》。如需继续,请回复“继续”。
发表回复