sqlite中并未提供单独的日期时间类型,但提供了三种时间表示方式
并且提供了一些日期时间函数,
函数 | 返回值 | 格式 |
---|---|---|
date(timestring, …) | 日期 | YYYY-MM-DD |
time(timestring, …) | 时间 | HH:MM:SS |
datetime(timestring, …) | 日期时间 | YYYY-MM-DD HH:MM:SS |
julianday(timestring, …) | 天数 | 自儒略日起算 |
strftime(format, timestring, …) | 日期 | format指定 |
简单示例如下
sqlite> select datetime('now');
2023-08-17 11:33:22
sqlite> select time('12:00');
12:00:00
sqlite> select date('2023-01-01');
2023-01-01
在未加修饰的情况下,日期格式只能YYYY-MM-DD,如果输入2023-1-1则并不会识别为日期。
在timstring后面,可以接一些修饰符,以更改输出,共有三种类型。第一种是在当前时间的基础上做加减法,例如
sqlite> select date('2023-08-17', '-4 months', '1 days');
2023-04-18
表示2023年8月17日减去4个月,然后再加上1天。days可以换成months, years, hours, minutes以及seconds,其中秒数的运算支持浮点型。
第二种是根指定相对于当前时刻的比较特殊的时间,比如本月第一天,一共有四个修饰符,分别是start of month, start of year, start of day, weekday N,其中weekday表示当前时刻距离最近的下一个星期N对应的日期,示例如下
sqlite> select date('2023-08-17', 'weekday 2');
2023-08-22
表示2023年8月17日的下一个星期二是8月22日。
第三类用于指定时间格式,共有以下三种情况
unixepoch | localtime | utc |
---|---|---|
unix时间戳 | 本地时间 | utc时间 |
strftime函数支持日期时间的格式化操作,
替换 | 描述 | 范围 | 替换 | 描述 | 范围 |
---|---|---|---|---|---|
%j | 年中日号 | 001-366 | %d | 月中日号 | 01-31 |
%W | 年中周号 | 01-53 | %w | 周中日号 | 0-6 |
%J | 儒略日数 | DDDD.DDDD | |||
%Y | 年 | YYYY | %m | 月 | 00-12 |
%H | 小时 | 00-23 | %M | 分 | 00-59 |
%f | 带小数部分的秒 | SS.SSS | |||
%s | 时间戳的秒数 | %S | 秒 | 00-59 | |
%% | % symbol |
其中,周日用0表示。
示例如下
sqlite> select strftime('今天是%Y年第%j天', 'now');
今天是2023年第229天
向数据库中输入日期时间和输入其他变量并没有区别,下面新建一个表,最后两列是日期时间,然后输入一组数据,效果如下。
sqlite> create table test(id int, name text, date, time);
sqlite> insert into test values(1, 'a', date('now'), time('now'));
sqlite> select * from test;
1|a|2023-08-17|11:56:04
但在sqlite3中,日期时间有更便捷的输入方式,只需在创建表的时候,为其添加一个默认的时间函数就可以了。
sqlite> create table dtTest([id] int, name text, [date] TimeStamp default (date('now')), [time] timeStamp default (time('now')));
这个表一共有4列,只有name是需要手动输入的
sqlite> insert into dtTest(name) values("a");
sqlite> insert into dtTest(name) values("b");
sqlite> select * from dtTest;
|a|2023-08-17|12:05:39
|b|2023-08-17|12:05:41