SQLite 并不提供专用的 DATETIME 数据类型,但它拥有强大的内建函数,允许你以灵活的方式处理时间字符串、时间戳与格式化输出。掌握这些特性对于日志记录、定时统计、事件触发等场景至关重要。


📚 目录

  1. SQLite 日期与时间的存储方式
  2. SQLite 核心时间函数总览
  3. 日期格式的转换与输出
  4. 时区与 UTC 处理策略
  5. 常见的时间计算案例
  6. 日期字段在实际开发中的应用建议
  7. 出站资源与站内推荐阅读
  8. 参考资料

1. 日期与时间的存储方式

SQLite 支持三种时间数据存储格式:

类型示例描述
TEXT'2025-04-09 15:30:00'可读性好,推荐
REAL2459580.14583Julian 日(不推荐)
INTEGER1712665800Unix 时间戳(精确、适合排序)

👉 SQLite 不强制使用 DATEDATETIME 类型,但你可以在表结构中定义为 TEXTINTEGER 类型并自行转换。


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. 📚 参考资料

  1. SQLite 日期函数手册:https://www.sqlite.org/lang_datefunc.html
  2. 《SQLite 权威指南》时间处理章节
  3. Stack Overflow 高赞答案:https://stackoverflow.com/questions/3471206
  4. SQLite 源码中对 date.c 的实现解析
  5. Unix timestamp vs ISO 格式比较研究

✅ 下一篇为终章之一:《SQLite 常用函数大全:数值、字符串、聚合函数全面指南》。如需继续,请回复“继续”。