行为
支持 #462
打开sqlite 时间字段
状态:
新建
优先级:
普通
指派给:
-
开始日期:
2026-01-02
计划完成日期:
% 完成:
0%
预期时间:
#2:
描述
SQLite 对时间字段的处理非常灵活,主要通过 TEXT、REAL 或 INTEGER 类型存储,没有专用的 DATETIME 类型。以下是核心要点:
1. 推荐的存储格式¶
| 存储类型 | 格式 | 示例 | 特点 |
|---|---|---|---|
| TEXT | ISO8601 字符串 | '2024-01-02 15:30:45' |
可读性强,推荐 |
| INTEGER | Unix 时间戳 | 1704205845 |
计算高效,省空间 |
| REAL | Julian Day Number | 2459580.145 |
天文/科学计算用 |
最常用的是 TEXT 类型,直接存储 ISO8601 格式(YYYY-MM-DD HH:MM:SS)。
2. 常用时间函数¶
-- 获取当前时间
SELECT datetime('now'); -- '2024-01-02 15:30:45'
SELECT date('now'); -- '2024-01-02'
SELECT time('now'); -- '15:30:45'
-- 时间计算(加减天数/月数)
SELECT datetime('now', '+1 day');
SELECT datetime('now', '-3 hours');
SELECT datetime('now', '+1 month');
-- 格式化
SELECT strftime('%Y-%m-%d', 'now'); -- '2024-01-02'
-- 转换时间戳
SELECT datetime(1704205845, 'unixepoch');
SELECT strftime('%s', 'now'); -- 获取当前时间戳
3. 建表示例¶
CREATE TABLE events (
id INTEGER PRIMARY KEY,
event_name TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
-- 或者使用时间戳
-- updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
);
-- 插入数据
INSERT INTO events (event_name) VALUES ('用户注册');
-- created_at 自动填充为当前时间
4. 查询示例¶
-- 查询今天的数据
SELECT * FROM events
WHERE date(created_at) = date('now');
-- 查询最近7天
SELECT * FROM events
WHERE created_at >= datetime('now', '-7 days');
-- 按天统计
SELECT date(created_at) as day, COUNT(*) as count
FROM events
GROUP BY day;
5. 最佳实践建议¶
优先使用 TEXT 存储 ISO8601 格式 - 兼容性好,可读性强
始终使用 UTC 时间 - 避免时区问题:datetime('now', 'utc')
建索引 - 对时间字段建立索引提升查询性能
应用层转换 - 在应用层处理本地时区显示
-- 创建带时区意识的表
CREATE TABLE events (
id INTEGER PRIMARY KEY,
event_name TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now', 'utc'))
);
CREATE INDEX idx_events_created ON events(created_at);
需要针对具体场景深入讲解吗?
没有任何数据可供显示
行为