1. 程式人生 > >SQLite教程(內建日期和時間函式)

SQLite教程(內建日期和時間函式)

SQLite資料庫

1. 簡介:

SQLite 是一個軟體庫,實現了自給自足的、無伺服器的、零配置的、事務性的 SQL 資料庫引擎。

2. 欄位型別:

  1. NULL: null值

  2. INTEGER: 一個帶有符號整數,根據值的大小儲存在1-4位元組中

  3. REAL:一個浮點數,儲存為8位元組的IEEE浮點數

  4. TEXT:一個文字字串,根據資料庫編碼儲存(UTF-8/UTF-16BE/UTF-16LE)

  5. BLOB:一個 blob 資料,完全根據它的輸入儲存。

更多其他資料庫(例如MYSQL)中欄位型別對應SQLite的型別,請參考SQlite型別官方介紹,看不懂英文的小夥伴,請看中文翻譯的

SQLite中資料型別

3. SQLite的增刪查改操作及事務:

SQLite的增刪查改操作比較常見,事務使用也比較常見,這裡不多做介紹。更多具體詳情,SQLite教程的增刪查改.

4. SQLite特殊資料儲存(重點):

  1. 儲存日期和時間資料型別:

    SQLite沒有專門提供儲存日期和時間儲存型別,通常可以TEXT , REAL和INTEGER型別來替代的方式儲存。

    • TEXT對應的資料:"YYYY-MM-DD HH:MM:SS.SSS"格式的資料

    • REAL對應的資料: Julian日期格式儲存,即從公元前 4714 年 11 月 24 日格林尼治時間的正午開始算起的天數。

    • INTEGER對應的資料:Unix時間形式的資料 , 即從 1970-01-01 00:00:00 UTC 算起的秒數。

    可以以任何上述格式來儲存日期和時間,並且可以使用內建的日期和時間函式來自由轉換不同格式。

  2. 布林資料型別:

    採用true用1替代和false用0替代的方式儲存。

SQLite 內建的日期 & 時間函式

SQLite 支援以下五個日期和時間函式,如:

 date(timestring, modifier, modifier, ...)  : 返回YYYY-MM-DD 格式的日期

 time(timestring, modifier, modifier, ...) :  返回 HH:MM:SS格式的時間

 datetime(timestring, modifier, modifier, ...
) 返回YYYY-MM-DD HH:MM:SS格式的日期時間 julianday(timestring, modifier, modifier, ...): 返回從格林尼治時間的公元前 47141124 日正午算起的天數 strftime(format, timestring, modifier, modifier, ...) :返回指定格式(即第一個引數)的日期

上述五個日期和時間函式把時間字串(TimeString)作為引數。時間字串後跟零個或多個 modifier 修飾符。strftime() 函式也可以把格式字串 format 作為其第一個引數。

注意點:以上幾個函式也可以轉換成strftime函式,如下:

date(...)         strftime('%Y-%m-%d', ...)

time(...)         strftime('%H:%M:%S', ...)

datetime(...)     strftime('%Y-%m-%d %H:%M:%S', ...) 

julianday(...)    strftime('%J', ...)   

下面將詳細講解函式中的不同型別的時間字串和修飾符,格式。

  1. TimeString(時間字串)

    一個帶有格式的具體時間(例如,2017-04-31),現在的時間用now替代。更多格式,具體如下:

    • YYYY-MM-DD :例如,2017-12-30
    • YYYY-MM-DD HH:MM: 例如,2017-12-30 12:10
    • YYYY-MM-DD HH:MM:SS.SSS 例如:2070-12-30 12:10:04.100
    • MM-DD-YYYY HH:MM 例如:30-12-2017 12:10
    • HH:MM 例如: 12:10
    • YYYY-MM-DDTHH:MM 2017-12-30 12:10
    • HH:MM:SS 12:10:01
    • YYYYMMDD HHMMSS 20171230 121001
    • now :例如,當前時間,2017-4-9
  2. Modifier(修飾符)

     1. NNN days
     2. NNN hours
     3. NNN minutes
     4. NNN.NNNN seconds
     5. NNN months
     6. NNN years
     7. start of month
     8. start of year
     9. start of day
     10. weekday N  
     11. unixepoch
     12. localtime
     13. utc
    • 從第1到第6,只是加減指定具體數量的時間或者日期,NNN為負數,則減去NNN個時間或者日期。反之,NNN為正,則加;
    • 第7到第9,是將指定日期設定到當前的月或年或日開始.start of month即當年-當月-1日,start of year即當年-1月-1日,依次類推;
    • 第10是將日期設定下一個星期N,其中星期日為0;
    • 第11是unix時間戳轉換成對應的日期和時間;
    • 第12是轉成當地的日期和時間;

    注意點:修飾符順序是從左邊到右邊依次逐個執行的,即執行完前一個才能執行下一個。

  3. Strftime()中使用的格式

格式   格式說明

%d  天數,例如:01-31中某一個天
%f  帶小數部分(SS.SSS格式)的秒
%H  小時,例如: 00-23中某一個小時
%j  一年中的第幾天,001-366
%J  儒略日數,DDDD.DDDD
%m  月,00-12中某一具體月份
%M  分,00-59
%s  從 1970-01-01 算起的秒數
%S  秒,00-59
%w  一週中的第幾天,0-6 (0 is Sunday)
%W  一年中的第幾周,01-53
%Y  年,YYYY
%%  % symbol

SQLite案例之使用時間和日期函式:

在Android SDK中的tools檔案下找到Sqlite.exe或者SQLite下載進行下載獲取。使用Sqlite3.exe來執行sql語句。

案例1:獲取YYYY-MM-DD格式的當前日期,例如 2017-4-9

分析:
1. 採用date()函式返回YYYY-MM-DD格式的日期
2. 採用時間字串now來指定當前時間

因此,此SQL語句為:SELECT date('now');

案例2:獲取當前月的最後一天,例如2017-4-30

分析:
1. 採用date()函式返回YYYY-MM-DD格式的日期
2. 採用時間字串(now)來指定當前時間,這時日期為 :當年-當月-當日
3. 使用修飾符(start of month)設定時間為當月,在這時日期為:當年-當月-1日
4. 新增一個月,即修飾符(1 month),在這時日期為:當年-(當月+1)-1日
5. 減去一天,即修飾符(- 1 day),獲取到當月最後一天,在這時日期為:當年-當月-最大天數

因此,此SQL語句為:SELECT date('now','start of month','+1 month','-1 day');

案例3:返回從1970-01-01 00:00:00到當前時間所流經的秒數

分析:
1. 採用strftime()函式
2. 採用秒的格式,%s
3. 指定時間字串(now)

因此,此SQL語句為:SELECT strftime('%s','now');

案例4:計算從 2004 年某一特定時刻以來的秒數

分析:
1. 計算到2004-01-01 02:34:56的秒速
2. 計算到當今的秒數
3. 兩者相減操作。

因此,此SQL語句為:SELECT strftime('%s','now') - strftime('%s','2004-01-01 02:34:56');

SQLite.exe執行sql,輸出結果如下:

這裡寫圖片描述

資源參考: