【问题标题】:How to store and get datetime value in SQLite如何在 SQLite 中存储和获取日期时间值
【发布时间】:2012-06-06 10:36:42
【问题描述】:

我的表包含数据类型为日期时间的出生日期字段。 我想得到今天生日的所有记录。 我怎样才能得到它?

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    试试这个查询:

    SELECT * FROM mytable
    WHERE strftime('%m-%d', 'now') = strftime('%m-%d', birthday)
    

    【讨论】:

    • 数据类型是什么?是TEXT吗?或者BLOB?如果文档说明sqlite3_bind_xxxx 的用途会很有帮助。我很想知道其他运营商,如>=,是否按预期工作。另请参阅SQLite binding function in prepared statement
    【解决方案2】:

    对我来说,拥有一个特殊的日期时间类型似乎总是不必要的开销,整数快速、灵活并且使用更少的空间。

    对于一般日期时间值,请使用 Unix 纪元时间戳。易于使用,极其灵活,并且与时区(甚至日历!)无关。 (我最近写了an article on using them, which I really have to plug...

    也就是说,如果您只对公历中的日期感兴趣,您可能希望使用以下格式的大整数:YYYYMMDD,例如 19761203。对于您的特殊用途,您甚至可以创建一个四位整数,如 MMDD ,比如说 1703 — 这一定会导致快速选择!

    【讨论】:

    • 看起来 SQLite 可以将日期存储为 unix 时间:sqlite.org/datatype3.html(参见“1.2 日期和时间数据类型”)。所以那里没有浪费空间。
    • 至于将日期存储为 YYYMMDD 之类的整数,那么有日期的生日呢?同一个月的生日怎么办?提取每个日期片段需要大量的 mod/div 操作。在我看来,你最好使用数据库的内置(优化和可读)工具,比如 NickD 的答案。
    【解决方案3】:

    SQLite 对存储日期的支持很差。您可以使用上面 Nick D 建议的方法,但请记住,此查询将导致全表扫描,因为 SQLite 中的日期未正确索引(实际上 SQLite 根本不支持将日期作为内置类型)。

    如果您真的想进行快速查询,那么您必须添加一个单独的(整体)列来存储生日 (1-31),并在数据库中为其附加索引。

    如果您只想比较日期,那么您可以添加一个 (INTEGER) 列来存储日期 UTC 值(但这个技巧不会让您轻松搜索单个日期组件)。

    祝你好运

    【讨论】:

    • DATE 或 DATETIME 将存储为 NUMERIC(参见 sqlite.org/datatype3.html 中的“2.2 关联名称示例”)作为 unix 时间(参见“1.2 日期和时间数据类型”部分)。存储日期和月份是一种可能的优化,存储另一个 INTEGER 列是多余的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2016-08-24
    • 1970-01-01
    • 2012-04-14
    • 2014-12-30
    • 2010-11-26
    相关资源
    最近更新 更多