项目

一般

简介

行为

支持 #462

打开

sqlite 时间字段

李立奎17 天 之前添加.

状态:
新建
优先级:
普通
指派给:
-
开始日期:
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);

需要针对具体场景深入讲解吗?

没有任何数据可供显示

行为

导出 Atom PDF