SQLite库笔记:日期和时间函数

1. 函数概述

SQLite支持7个日期和时间函数,如下:

|---|-------------------------------------------------------|-----------------------------------------|
| 1 | date(time-value, modifier, modifier, ...) | 返回YYYY-MM-DD格式的日期 |
| 2 | time(time-value, modifier, modifier, ...) | 返回HH:MM:SS格式的时间 |
| 3 | datetime(time-value, modifier, modifier, ...) | 返回YYYY-MM-DD HH:MM:SS格式的日期时间 |
| 4 | julianday(time-value, modifier, modifier, ...) | 返回从格林尼治时间的公元前 4714 年 11 月 24 日正午算起的天数 |
| 5 | unixepoch(time-value, modifier, modifier, ...) | 返回unix时间戳,即1970-01-01 00:00:00 UTC以来的秒数 |
| 6 | strftime(format, time-value, modifier, modifier, ...) | 返回format指定格式的日期时间 |
| 7 | timediff(time-value A, time-value B) | 返回一个字符串,该字符串描述为到达时间A而必须添加到B的时间量 |

其中strftime()的format格式字符串支持在标准 C 库的 strftime()函数中找到的最常见替换项,以及两个新的替换项,即 %f 和 %J。 以下是有效 strftime()替换的完整列表,截至SQLite版本 3.46.0 (2024-05-23)。SQLite 的早期版本可能不支持所有替换。如果未定义或不受支持看到替换,结果为 NULL。

|----|---------------------------------|
| %d | 月份的第几天: 01-31 |
| %e | 月份的第几天,不带前导零: 1-31 |
| %f | 带小数部分的秒: SS.SSS |
| %F | ISO 8601日期: YYYY-MM-DD |
| %G | ISO 8601年份对应%V |
| %g | 2位ISO 8601年份对应%V |
| %H | 小时: 00-24 |
| %I | 12小时制的小时: 01-12 |
| %j | 年份的第几天: 001-366 |
| %J | 儒略历日(小数) |
| %k | 不带前导零的小时: 0-24 |
| %l | 12小时制的小时,不带前导零: 1-12 |
| %m | 月份: 01-12 |
| %M | 分钟: 00-59 |
| %p | 取决于小时的"AM" 或"PM" |
| %P | 取决于小时的"am" or "pm" |
| %R | ISO 8601时间: HH:MM |
| %s | 1970-01-01以来的秒数 |
| %S | 秒: 00-59 |
| %T | ISO 8601时间: HH:MM:SS |
| %U | 年份的第几周(00-53)-第01周从第一个星期日开始 |
| %u | 一周的第几天(1-7),其中周一为第1天 |
| %V | ISO 8601一年中第几个星期 |
| %w | 一周的第几天(0-6),其中周日为0 |
| %W | 一年的第几周 (00-53) -- 第01周从第一个星期日开始 |
| %Y | 年份: 0000-9999 |
| %% | % |

strftime()比较灵活,其它日期和时间函数可以用strftime()表示:

|----------------|------------------------------------|
| 函数 | 等同于strftime() |
| date(...) | strftime('%Y-%m-%d', ...) |
| time(...) | strftime('%H:%M:%S', ...) |
| datetime(...) | strftime('%Y-%m-%d %H:%M:%S', ...) |
| julianday(...) | strftime('%J', ...) |

2. time-value时间字符串

上面列表的time-value时间字符串通常是一个字符串,可以使用下列格式:

YYYY-MM-DD

YYYY-MM-DD HH:MM

YYYY-MM-DD HH:MM:SS

YYYY-MM-DD HH:MM:SS.SSS

YYYY-MM-DDTHH:MM

YYYY-MM-DDTHH:MM:SS

YYYY-MM-DDTHH:MM:SS.SSS

HH:MM

HH:MM:SS

HH:MM:SS.SSS

now

DDDDDDDDDD

上述格式中标红的"T"是分隔的文字字符。倒数第二个格式字符串"now",可转换为当前日期。

3. modifier修饰符

对于除 timediff()以外的所有日期/时间函数, time-value 参数后面可以跟零个或多个modifier修饰符,这些修饰符更改日期时间。每个修饰符都是应用于其左侧时间值的转换。注意,顺序很重要。可用的修饰符如下

  • NNN days
  • NNN hours
  • NNN minutes
  • NNN seconds
  • NNN months
  • NNN years
  • ±HH:MM
  • ±HH:MM:SS
  • ±HH:MM:SS.SSS
  • ±YYYY-MM-DD
  • ±YYYY-MM-DD HH:MM
  • ±YYYY-MM-DD HH:MM:SS
  • ±YYYY-MM-DD HH:MM:SS.SSS
  • ceiling
  • floor
  • start of month
  • start of year
  • start of day
  • weekday N
  • unixepoch
  • julianday
  • auto
  • localtime
  • utc
  • subsec
  • subsecond

4. 示例

计算当前日期:

bash 复制代码
sqlite> select date(); 
2024-08-09

计算unix时间戳的日期和时间、某日期时间的unix时间戳:

bash 复制代码
sqlite> select datetime(1092941466, 'unixepoch');
2004-08-19 18:51:06
sqlite> select unixepoch('2004-08-19 18:51:06');
1092941466

计算2024-01-01 12:00:00距离1970-01-01有多久:

bash 复制代码
sqlite> select timediff('2024-01-01 12:00:00', '1970-01-01');
+0054-00-00 12:00:00.000

计算当前日期时间(UTC)、本地时区的日期时间:

bash 复制代码
sqlite> select strftime('%F %T');
2024-08-09 13:57:04
sqlite> select strftime('%Y-%m-%d %H:%M:%S');
2024-08-09 13:57:04
sqlite> select strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime');
2024-08-09 21:57:04

注意:SQLite默认是UTC时间,获取当地时间可以加上'localtime'修饰符。

相关推荐
职豚求职小程序刷题14 小时前
国投证券笔试测评题型揭秘
笔记
Nuanyt14 小时前
LeetCode Hot100 刷题笔记 · 普通数组专题
java·笔记·算法·leetcode
职豚求职小程序16 小时前
蒙牛27秋招|数智化未来星测评重点整理✅
笔记
沪上企服通16 小时前
从票据到凭证的数据血缘:代账系统的 traceability 与可审计回放设计笔记
笔记
春弦_16 小时前
LeetCode Hot 100 刷题笔记
笔记·leetcode·哈希算法
叼烟扛炮16 小时前
Linux 学习笔记(四):文件检索与管道重定向
linux·笔记·学习
从零数据分析17 小时前
零基础学SQL 23:和上月比总对不上?LAG/LEAD 一步取出上一次(附 4 个模板)
java·数据库·sql·mysql·oracle·sqlite·database
愤怒火龙果18 小时前
蓝队笔记整理04 安全设备、内网处置与云上防护
笔记·网络安全
果壳science19 小时前
张祥前最新研究成果登上SCI期刊!
笔记·嵌入式硬件·算法·硬件工程·几何学
Rabitebla19 小时前
【Linux 底层原理】工具篇(一):掌握 Ubuntu apt,让软件安装与管理更简单
linux·笔记·算法·ubuntu