日期与时间 (Date & Time)
1. 核心概念:没有专门的数据类型
这是 SQLite 与 MySQL、PostgreSQL 等数据库最大的不同点:SQLite 没有专门的 DATETIME、DATE 或 TIMESTAMP 存储类(Storage Class)。
虽然你在建表时可以写 CREATE TABLE t (d DATETIME),但这只是为了兼容性和类型亲和性(Affinity),SQLite 实际上会将日期和时间作为 TEXT(文本)、REAL(浮点数) 或 INTEGER(整数) 存储。
三种常见的存储格式
-
TEXT (ISO8601 字符串) - 推荐
- 格式:
"YYYY-MM-DD HH:MM:SS.SSS" - 示例:
'2023-10-27 14:30:00' - 优点:人类可读,直接支持字符串比较(
>、<)和排序,兼容性最好。
- 格式:
-
INTEGER (Unix Time / 时间戳)
- 格式:从 1970-01-01 00:00:00 UTC 开始的秒数。
- 示例:
1698417000 - 优点:占用空间小(64位整数),计算时间差非常快。
-
REAL (Julian Day / 儒略日)
- 格式:从公元前 4714 年 11 月 24 日正午开始的天数。
- 示例:
2460245.10416667 - 优点:非常适合计算跨度很大的历史日期或精确的天数差。
2. 五大核心函数
SQLite 提供了一组内置函数来处理上述格式的转换和计算。
date(...):返回日期字符串YYYY-MM-DD。time(...):返回时间字符串HH:MM:SS。datetime(...):返回完整日期时间YYYY-MM-DD HH:MM:SS。julianday(...):返回儒略日(浮点数),用于计算天数差。strftime(format, ...):最强大的函数,用于自定义格式化(上述 1-4 其实都是它的简写形式)。
3. 获取当前时间
注意:SQLite 默认使用 UTC(协调世界时)。
获取当前 UTC 时间
获取当前本地时间
如果你需要服务器所在时区的时间,必须加上 'localtime' 修饰符。
4. 时间计算与修饰符 (Modifiers)
SQLite 的强大之处在于可以通过“修饰符”对时间进行加减运算。修饰符从左到右依次应用。
基本语法:
函数(时间字符串, 修饰符1, 修饰符2, ...)
常用修饰符
NNN days(加减天数)NNN months(加减月数)NNN years(加减年数)NNN hours/minutes/secondsstart of month(月初)start of year(年初)start of day(当天的 00:00:00)weekday N(前进到下一个星期几,0=周日, 6=周六)
实战示例
1. 计算 7 天后的日期:
2. 获取本月第一天:
3. 获取上个月的最后一天: 逻辑:先回到本月初,再减去 1 天。
4. 计算明年特定日期的星期几:
5. strftime 格式化详解
strftime(format, timestring, modifier, ...) 类似于 C 语言的 strftime。
常用替换符
示例:将当前时间转换为 Unix 时间戳
6. 计算时间差
在 SQLite 中计算两个日期之间相差多少天或多少秒,通常需要转换格式。
计算相差的天数
使用 julianday() 将两个时间转换为浮点数,然后相减。
计算相差的秒数
使用 strftime('%s', ...) 或 unixepoch() (SQLite 3.38+)。
7. 最佳实践
-
统一存储格式:在一个项目中,选定一种格式(建议 TEXT ISO8601 或 INTEGER 时间戳)并坚持使用。不要混用。
-
存储 UTC:永远在数据库中存储 UTC 时间。只有在展示给用户时,才转换为本地时间 (
localtime)。这样可以避免跨时区、夏令时等带来的复杂问题。 -
利用索引:如果你使用 TEXT 格式 (
YYYY-MM-DD HH:MM:SS),它是可以直接按字母顺序排序的。这意味着你可以安全地在日期列上建立索引,并使用BETWEEN或>进行高效查询。
8. 新特性:unixepoch (SQLite 3.38+)
在 SQLite 3.38.0 (2022年发布) 及以上版本,新增了 unixepoch() 函数,处理时间戳更加方便。

