SQLite 的日期和时间函数提供了丰富的日期处理能力:
-
日期时间存储格式
- SQLite 没有专门的日期时间类型
- 通常以 TEXT(ISO8601 字符串)、REAL(Julian 日数)或 INTEGER(Unix 时间戳)存储
- 推荐使用 TEXT 类型存储 ISO8601 格式:'YYYY-MM-DD HH:MM:SS'
-
主要日期时间函数
- date():返回日期
- time():返回时间
- datetime():返回日期时间
- julianday():返回 Julian 日数
- strftime():格式化日期时间
- unixepoch():Unix 时间戳转换
-
获取当前日期时间
sql-- 当前日期 SELECT date('now'); -- 输出: 2026-02-18 -- 当前时间 SELECT time('now'); -- 输出: 11:24:00 -- 当前日期时间 SELECT datetime('now'); -- 输出: 2026-02-18 11:24:00 -- 当前 Unix 时间戳 SELECT strftime('%s', 'now'); -- 输出: 1739869440 -
日期时间计算
sql-- 加减天数 SELECT date('now', '+7 days'); SELECT date('now', '-1 month'); -- 加减时间 SELECT datetime('now', '+3 hours', '-30 minutes'); -- 计算日期差 SELECT julianday('now') - julianday('2026-01-01'); -
日期时间格式化
sql-- 自定义格式 SELECT strftime('%Y-%m-%d %H:%M:%S', 'now'); -- 常用格式说明符 -- %Y: 4位年份 -- %m: 月份 (01-12) -- %d: 日期 (01-31) -- %H: 小时 (00-23) -- %M: 分钟 (00-59) -- %S: 秒 (00-59) -- %w: 星期 (0-6, 0=周日) -- %j: 一年中的第几天 (001-366) -
日期时间解析
sql-- 解析字符串为日期时间 SELECT datetime('2026-02-18 11:24:00'); -- 从 Unix 时间戳转换 SELECT datetime(1739869440, 'unixepoch'); -- 从 Julian 日数转换 SELECT datetime(2460585.974, 'julianday'); -
日期时间比较
sql-- 比较日期 SELECT * FROM orders WHERE order_date > date('now', '-30 days'); -- 日期范围查询 SELECT * FROM events WHERE event_date BETWEEN date('now') AND date('now', '+7 days'); -
实际应用场景
sql-- 创建订单表 CREATE TABLE orders ( id INTEGER PRIMARY KEY, order_date TEXT, status TEXT ); -- 插入当前时间 INSERT INTO orders (order_date, status) VALUES (datetime('now'), 'pending'); -- 查询今天的订单 SELECT * FROM orders WHERE date(order_date) = date('now'); -- 查询本周的订单 SELECT * FROM orders WHERE order_date >= date('now', 'weekday 0', '-7 days'); -
时区处理
sql-- UTC 时间 SELECT datetime('now', 'utc'); -- 本地时间 SELECT datetime('now', 'localtime'); -- 时区转换 SELECT datetime('now', '+8 hours'); -
性能优化
- 为日期列创建索引
- 使用函数包装列会导致索引失效
- 考虑使用生成列存储格式化日期
- 避免在 WHERE 子句中使用复杂日期函数
SQLite 的日期时间函数功能强大,能够满足大多数日期处理需求。