SQLite 日期 & 时间
                           
天天向上
发布: 2025-03-04 20:51:36

原创
505 人浏览过

在 SQLite 中,日期和时间的处理并不像在其他数据库系统中那样提供专门的数据类型。SQLite 没有内置的 DATETIME 类型,而是通过文本、整数或实数类型来存储日期和时间。SQLite 提供了一些内置的日期和时间函数,可以帮助你存储、处理和查询日期与时间数据。

1. 日期和时间的存储方式

SQLite 存储日期和时间有三种常见的格式:

  • 文本(TEXT):以 YYYY-MM-DD HH:MM:SS 格式存储日期和时间。
  • 整数(INTEGER):存储自纪元(1970年1月1日00:00:00 UTC)以来的秒数(Unix 时间戳)。
  • 实数(REAL):存储自纪元以来的天数(包括小数部分,精确到天和时间)。

2. SQLite 日期和时间函数

SQLite 提供了多个内置的日期和时间函数,以下是一些常见的函数:

2.1 DATE()

DATE() 函数用于返回当前日期,或者根据指定的日期字符串计算日期。

SELECT DATE('now');  -- 返回当前日期 (YYYY-MM-DD)

你也可以传入其他日期进行计算:

SELECT DATE('2025-03-04', '+1 day');  -- 返回 '2025-03-05'
SELECT DATE('2025-03-04', '-1 day');  -- 返回 '2025-03-03'
SELECT DATE('2025-03-04', '+2 years');  -- 返回 '2027-03-04'

2.2 TIME()

TIME() 函数用于返回当前时间,或者计算给定时间的时间值。

SELECT TIME('now');  -- 返回当前时间 (HH:MM:SS)

2.3 DATETIME()

DATETIME() 函数返回当前的日期和时间,或者根据指定的日期和时间字符串计算结果。

SELECT DATETIME('now');  -- 返回当前的日期和时间 (YYYY-MM-DD HH:MM:SS)

你也可以用来加减时间:

SELECT DATETIME('2025-03-04 12:00:00', '+1 day');  -- 返回 '2025-03-05 12:00:00'
SELECT DATETIME('2025-03-04 12:00:00', '-1 hour');  -- 返回 '2025-03-04 11:00:00'

2.4 JULIANDAY()

JULIANDAY() 函数返回自公元前4713年1月1日以来的儒略日数,表示为一个实数。

SELECT JULIANDAY('now');  -- 返回当前时间的儒略日数

2.5 STRFTIME()

STRFTIME() 是一个非常强大的日期时间格式化函数,可以根据指定的格式返回日期和时间。

SELECT STRFTIME('%Y-%m-%d %H:%M:%S', 'now');  -- 返回当前日期和时间
SELECT STRFTIME('%A, %B %d, %Y', 'now');  -- 返回类似 'Monday, March 04, 2025'

STRFTIME 支持多种格式字符,用于输出不同格式的日期和时间:

  • %Y:四位年份
  • %m:月份(01-12)
  • %d:日期(01-31)
  • %H:小时(00-23)
  • %M:分钟(00-59)
  • %S:秒数(00-59)
  • %A:星期几的全称(例如:Monday)
  • %B:月份的全称(例如:March)

3. 计算日期和时间

SQLite 支持通过 +- 操作符对日期和时间进行加减运算。例如:

SELECT DATE('2025-03-04', '+5 days');  -- 返回 '2025-03-09'
SELECT DATE('2025-03-04', '-1 year');  -- 返回 '2024-03-04'
SELECT DATETIME('now', '+3 hours');  -- 返回当前时间加上3小时

4. 日期和时间与当前时间的比较

你可以使用 SQLite 中的日期和时间函数进行比较。例如,你可以查询今天和特定日期之间的差异,或者根据日期筛选记录。

示例:

-- 获取当前日期前后的记录
SELECT * FROM orders WHERE order_date > DATE('now');

5. 从 Unix 时间戳中提取日期

SQLite 可以从 Unix 时间戳中提取日期。例如,假设有一个存储 Unix 时间戳的列 timestamp,你可以使用 DATETIME() 函数将其转换为可读的日期和时间。

SELECT DATETIME(timestamp, 'unixepoch') FROM logs;

这里的 'unixepoch' 是指将存储的 Unix 时间戳转换为相应的日期时间。

6. 处理时区

SQLite 的日期和时间函数本身不支持时区转换。所有的日期和时间值通常是以 UTC 时间处理的。如果你需要处理时区,可以在应用层面上做相应的转换,或者使用 UTC 时间并在展示时进行本地时区转换。

7. 小结

  • SQLite 不提供专门的 DATETIME 数据类型,而是通过文本、整数和实数类型存储日期和时间。
  • 提供了多种函数(如 DATE()TIME()DATETIME()STRFTIME() 等)来处理和计算日期时间。
  • 你可以通过 +- 来对日期进行加减运算。
  • STRFTIME() 是最常用的函数,能够灵活地格式化日期和时间。

通过使用这些内置的日期和时间函数,SQLite 可以灵活地处理日期和时间,满足各种日期时间计算和查询需求。


以下是一些扩展的主题和操作:

8. 日期与时间的类型转换

在 SQLite 中,日期和时间被存储为文本、整数或实数,如何在这些类型之间转换是使用 SQLite 处理日期时间时需要了解的重要内容。SQLite 提供了几个内置函数,帮助你在不同的数据类型之间进行转换。

8.1 从 Unix 时间戳转换

如果你有 Unix 时间戳(自 1970 年 1 月 1 日以来的秒数),你可以将它转换为可读的日期和时间格式:

SELECT DATETIME(1609459200, 'unixepoch');  -- 输出 '2021-01-01 00:00:00'

这个查询将给定的 Unix 时间戳 1609459200 转换为标准的日期时间格式 YYYY-MM-DD HH:MM:SS

8.2 将日期时间转换为 Unix 时间戳

同样,你也可以将日期时间转换为 Unix 时间戳,使用 strftime 函数:

SELECT STRFTIME('%s', '2025-03-04 12:00:00');  -- 输出 '1741382400'

这里的 %s 返回自纪元(1970年1月1日)以来的秒数。

9. 日期和时间的偏移量

SQLite 支持对日期和时间进行加减操作,可以方便地进行一些常见的日期计算。你可以使用类似 'YYYY-MM-DD' 的格式和偏移量来调整日期。

9.1 向日期添加或减去时间

SELECT DATE('2025-03-04', '+1 month');  -- 返回 '2025-04-04'
SELECT DATE('2025-03-04', '-2 weeks');  -- 返回 '2025-02-18'
SELECT DATETIME('2025-03-04 12:00:00', '+2 hours');  -- 返回 '2025-03-04 14:00:00'

上面的查询展示了如何在日期和时间上加上或减去时间单位,如月、周、天、小时等。

9.2 使用日期和时间函数计算差异

你还可以计算日期之间的差异。例如:

SELECT JULIANDAY('2025-03-04') - JULIANDAY('2024-03-04');  -- 返回 '366' (闰年)

这里,JULIANDAY 函数返回从公元前4713年1月1日起的日数,通过计算两个日期之间的差异,你可以得到相差的天数。

10. 时区处理

SQLite 本身并不支持时区,因此日期和时间的存储通常是基于 UTC(协调世界时)。在进行时区转换时,通常是在应用层面进行处理。如果你想在 SQLite 中处理时区,你可以存储日期和时间的 UTC 表示,并在查询时根据需要进行转换。

例如,如果你知道 UTC 时间,可以通过使用 DATETIME() 函数将其转换为本地时间:

SELECT DATETIME('2025-03-04 12:00:00', 'localtime');  -- 将 UTC 转换为本地时间

这里的 'localtime' 选项会将 UTC 时间转换为本地时间,前提是 SQLite 运行环境有正确的本地时区设置。

11. 日期格式化

SQLite 允许使用 STRFTIME() 函数格式化日期和时间,支持多种格式化字符。下面是一些常见的格式化符号:

  • %Y:四位年份(例如:2025)
  • %m:月份(01-12)
  • %d:日期(01-31)
  • %H:小时(00-23)
  • %M:分钟(00-59)
  • %S:秒数(00-59)
  • %A:星期几的全称(例如:Monday)
  • %B:月份的全称(例如:March)
  • %w:星期几(0=Sunday, 6=Saturday)
  • %s:Unix 时间戳(秒数)

示例:

SELECT STRFTIME('%A, %B %d, %Y %H:%M:%S', 'now');  -- 返回当前日期时间,如 'Monday, March 04, 2025 12:30:45'
SELECT STRFTIME('%Y-%m-%d', '2025-03-04');  -- 返回 '2025-03-04'
SELECT STRFTIME('%H:%M:%S', 'now');  -- 返回当前时间,如 '12:30:45'

12. 处理闰年和月差

SQLite 会自动处理闰年和月份的不同天数。例如,2 月有 28 或 29 天,月份的天数会随着年份的不同而变化。

SELECT DATE('2024-02-29', '+1 month');  -- 2024年是闰年,返回 '2024-03-29'
SELECT DATE('2025-02-28', '+1 month');  -- 2025年不是闰年,返回 '2025-03-28'

13. 日期时间的排序

SQLite 可以直接对日期时间进行排序。在查询中,日期和时间会按升序或降序排序,具体取决于列的数据类型和查询语句。

SELECT * FROM events ORDER BY event_date ASC;  -- 按照日期升序排序
SELECT * FROM events ORDER BY event_date DESC;  -- 按照日期降序排序

如果 event_date 列存储的是文本类型的日期(如 'YYYY-MM-DD' 格式),SQLite 会按字典顺序对其进行排序,因为日期字符串的字典顺序和日期的时间顺序是相同的。

14. 结合 WHERE 子句使用日期

你可以在 WHERE 子句中使用日期和时间函数来筛选特定的记录。

示例:

SELECT * FROM orders WHERE order_date > DATE('now', '-7 days');  -- 最近7天的订单
SELECT * FROM events WHERE event_time < DATETIME('now');  -- 所有过去的事件

15. 总结

SQLite 的日期和时间处理提供了灵活的函数和操作:

  • 使用 DATE()TIME()DATETIME() 等函数来获取当前的日期、时间或日期时间。
  • 通过 STRFTIME() 函数可以格式化日期时间,灵活地根据需求呈现不同的格式。
  • 通过 +- 操作符,SQLite 支持对日期时间进行加减运算,帮助计算日期差异或调整日期。
  • SQLite 默认处理日期时间为 UTC,因此时区转换通常需要在应用层面进行。
  • 在查询时,SQLite 支持日期排序、筛选和格式化。

掌握这些 SQLite 的日期和时间处理功能,你可以高效地处理与时间相关的数据。更多详细内容请关注其他相关文章。

发表回复 0

Your email address will not be published. Required fields are marked *