SQLite 常用 SQL
主键自增
创建表时将主键列设置为 INTEGER PRIMARY KEY , 例如:
CREATE TABLE [Test] ( [Id] INTEGER PRIMARY KEY, [Name] NVARCHAR(20) NOT NULL );
最后插入的行号
查看最后插入的行号是用 last_insert_rowid() 函数, 与 SQL Server 的 @@Identity 类似,例如:
INSERT INTO [Test] (Name) VALUES ('Test') SELECT LAST_INSERT_ROWID()
连接两个字符串
将两个字符串连接起来用 || , 例如:
INSERT INTO [Test] (Name) VALUES ('Test_' || CAST(LAST_INSERT_ROWID() AS NVARCHAR(10)));
日期与时间
SQLite 支持下面 5 个日期与时间函数:
- date(timestring, modifier, modifier, ...)
- time(timestring, modifier, modifier, ...)
- datetime(timestring, modifier, modifier, ...)
- julianday(timestring, modifier, modifier, ...)
- strftime(format, timestring, modifier, modifier, ...)
这 5 个函数都接受一个时间字符串作为参数, 紧跟着的是可选的修饰符。 strftime 函数还接受一个格式化字符串作为它的第一个参数。
这些时间日期函数使用 ISO-8601 规定的时间日期格式的子集, date 函数返回 YYYY-MM-DD 格式的日期, time 函数返回 HH:MM:SS 格式的时间, 而 datetime 则返回 "YYYY-MM-DD HH:MM:SS" 格式的日期时间; julianday 函数则返回自儒略日(公元前4713年1月1日)的天数; strftime 返回的格式则由其参数决定, 下面是 strftime 可以接受的参数格式:
- %d day of month: 00
- %f fractional seconds: SS.SSS
- %H hour: 00-24
- %j day of year: 001-366
- %J Julian day number
- %m month: 01-12
- %M minute: 00-59
- %s seconds since 1970-01-01
- %S seconds: 00-59
- %w day of week 0-6 with Sunday==0
- %W week of year: 00-53
- %Y year: 0000-9999
- %% %
所有的日期时间函数都可以用 strftime 函数表示, 提供这些函数的唯一原因是为了方便和高效, 例如:
date(...) | strftime('%Y-%m-%d', ...) |
time(...) | strftime('%H:%M:%S', ...) |
datetime(...) | strftime('%Y-%m-%d %H:%M:%S', ...) |
julianday(...) | strftime('%J', ...) |
可接受的时间字符串
- 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
在第 5 至第 7 个格式中, "T" 是 ISO-8601 规定的日期时间分隔符; 第 8 至 第 10 个格式中只声明了时间, 其对应的日期为 2000-01-01 ; 第 11 个格式 ‘now’ 表示从系统获取的当前 UTC 时间; 第 12 个格式则表示从儒略日起的日期数。
修饰符
时间字符串可以跟多个可选的修饰符来对时间进行调整, 每个修饰符是对其左边时间值得一个转换, 从左到右依次应用, 顺序很重要。 可用的修饰符如下:
- NNN days
- NNN hours
- NNN minutes
- NNN.NNNN seconds
- NNN months
- NNN years
- start of month
- start of year
- start of day
- weekday N
- unixepoch
- localtime
- utc
前 6 个修饰符用于向时间字符串或修饰符指定的日期时间添加指定数量的时间。 注意 "±NNN months" 的工作方式是: 先将原来的日期渲染成 YYYY-MM-DD 格式, 对月份添加 ±NNN 的值, 然后再对结果进行修正。 如果 2001-03-31 添加了 '+1 month' 修饰符, 则应先得到 2001-04-31 , 由于 4 月只有 30 天, 所以结果会被修正为 2001-05-01 。 如果向闰年的 2 月 29 日添加了 '±N years' 修饰符, 当 N 不是 4 的倍数时, 也会发生这样的修正。
第 7 到 9 的那些 "start of" 修饰符将日期转换为当前日、 月、 年的开始时间。
修饰符 "weekday" 将日期向后推进直到下一周的指定天数。 星期天是 0 , 星期一是 1 , 依此类推。
第 11 个修饰符 "unixepoch" 只有在日期格式为 "DDDDDDDDDD" 时才有效, 将 unix 时间戳转换成时间, 由于参数是 64 位整数, 因此, 有效地时间范围是 0000-01-01 00:00:00 至 5352-11-01 10:52:47 (Unix 时间 -62167219200 至 10675199167)
修饰符 "localtime" 将 utc 时间转换为本地时间, "utc" 则相反。
示例
计算当前日期:
SELECT date('now');
计算当前月的最后一天:
SELECT date('now','start of month','+1 month','-1 day');
计算给定 unix 时间戳对应的日期时间:
SELECT datetime(1092941466, 'unixepoch');
计算给定 unix 时间戳对应的日期时间并转换成本地时间:
SELECT datetime(1092941466, 'unixepoch', 'localtime');
计算当前的 unix 时间戳:
SELECT strftime('%s','now');
计算从美国独立到现在的天数:
SELECT julianday('now') - julianday('1776-07-04');
计算从2004年某个时刻到现在的秒数:
SELECT strftime('%s','now') - strftime('%s','2004-01-01 02:34:56');
计算今年10月份的第一个星期三:
SELECT date('now','start of year','+9 months','weekday 2');
计算 unix 时间纪元到现在的秒数(与 strftime('%s','now') 类似, 包含小数部分):
SELECT (julianday('now') - 2440587.5)*86400.0;HH:MM:SS
张志敏所有文章遵循创作共用版权协议,要求署名、非商业 、保持一致。在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。
本博客已经迁移到 GitHub , 围观地址: https://beginor.github.io/