• sqlite3日期时间格式化和自动输入


    Sqlite3系列:初步💎where💎select

    基础命令

    sqlite中并未提供单独的日期时间类型,但提供了三种时间表示方式

    • 通过text来存储时间文本
    • 用整型来存储时间戳,时间戳是从1970-01-01算起的秒数
    • 用浮点型来存储自儒略日开始算起的天数,儒略日即公元前4713年1月1日中午12点。

    并且提供了一些日期时间函数,

    函数返回值格式
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在未加修饰的情况下,日期格式只能YYYY-MM-DD,如果输入2023-1-1则并不会识别为日期。

    修饰符

    在timstring后面,可以接一些修饰符,以更改输出,共有三种类型。第一种是在当前时间的基础上做加减法,例如

    sqlite> select date('2023-08-17', '-4 months', '1 days');
    2023-04-18
    
    • 1
    • 2

    表示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
    
    • 1
    • 2

    表示2023年8月17日的下一个星期二是8月22日。

    第三类用于指定时间格式,共有以下三种情况

    unixepochlocaltimeutc
    unix时间戳本地时间utc时间

    格式化

    strftime函数支持日期时间的格式化操作,

    替换描述范围替换描述范围
    %j年中日号001-366%d月中日号01-31
    %W年中周号01-53%w周中日号0-6
    %J儒略日数DDDD.DDDD
    %YYYYY%m00-12
    %H小时00-23%M00-59
    %f带小数部分的秒SS.SSS
    %s时间戳的秒数%S00-59
    %%% symbol

    其中,周日用0表示。

    示例如下

    sqlite> select strftime('今天是%Y年第%j天', 'now');
    今天是2023年第229
    • 1
    • 2

    自动输入时间

    向数据库中输入日期时间和输入其他变量并没有区别,下面新建一个表,最后两列是日期时间,然后输入一组数据,效果如下。

    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
    
    • 1
    • 2
    • 3
    • 4

    但在sqlite3中,日期时间有更便捷的输入方式,只需在创建表的时候,为其添加一个默认的时间函数就可以了。

    sqlite> create table dtTest([id] int, name text, [date] TimeStamp default (date('now')), [time] timeStamp default (time('now')));
    
    • 1

    这个表一共有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
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    软件工程导论——第六章——详细设计
    等级保护定级之备案!
    基于grpc从零开始搭建一个准生产分布式应用(6) - 06 - MapStruct常见问题汇总
    Nacos使用教程(三)——nacos注册中心(2)
    mysql.mongoDb,neo4j数据库对比
    客户案例 | 思腾合力助力深度图灵生成式AI应用平台建设
    【2023最新美团笔试题目分析】“求最多出现数字及次数“、坦克大战在线对战游戏(问题描述 + 示例代码 + 时间复杂度分析)
    大数据技术之SparkCore
    go-redis 使用 redis 6.0.14 版本错误: consider implementing encoding.BinaryMarshaler
    作业工时数据分析怎么做?如何进行作业工时数据分析
  • 原文地址:https://blog.csdn.net/m0_37816922/article/details/132382019