主鍵自增
創建表時將主鍵列設置為 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