Python與SQLite日期時間函數的使用


    SQLite的時間函數跟Python的時間函數有些許差別,所以稍做記錄,供自己以后查詢。
    網上有將SQLite官方WIKI內容翻譯成中文的文章,大家有興趣可以搜索一下,我這里單純記錄一下個人比較常用的一些內容。

SQLite的五個時間函數:

date(日期時間字符串, 修正符, 修正符, ......)
time(日期時間字符串, 修正符, 修正符, ......)
datetime(日期時間字符串, 修正符, 修正符, ......)
julianday(日期時間字符串, 修正符, 修正符, ......)
strftime(日期時間格式, 日期時間字符串, 修正符, 修正符, ......)

 

date() 返回一個以"YYYY-MM-DD"為格式的日期;
time() 返回一個以"YYYY-MM-DD HH:MM:SS"為格式的日期時間;
datetime() 返回一個日期時間格式的對象;
julianday() 返回一個天數,從格林威治時間公元前4714年11月24號開始算起;
strftime() 返回一個經過格式化的日期時間。

 

例子一:計算當前時間
值得注意的是最好加上'localtime',只有一個'now'返回的是格林尼治時間。不然像我在東八區的話,時間會相差八小時。這里曾經讓我誤認為虛擬機的時間不同步。

1 sqlite> select datetime('now');
2 2013-01-07 05:21:07
3 
4 sqlite> select datetime('now','localtime');
5 2013-01-07 13:21:09

 

例子二:計算當前月份最后一天
可以在修正符里面進行 年月日 的加減,但是 星期 不支持,返回的是空。

1 sqlite> select date('now','start of month','+1 month','-1 day');
2 2013-01-31
3 
4 sqlite> select date('now','start of month','+1 month','-1 day','+1 year');
5 2014-01-31
6 
7 sqlite> select date('now','start of month','+1 month','-1 day','+1 week');

 

例子三:計算兩個日期相差的天數
當然羅,要是計算相差的小時,分鍾或者秒,分別乘上12,60,60就能達到效果了。比如后面計算的是兩個日期相差的小時。

1 sqlite> select julianday('now') - julianday('2012-12-22');
2 16.2240774538368
3 
4 sqlite> select (julianday('now') - julianday('2012-12-22')) * 12;
5 194.796493470669

 

例子四:使用strftime對字符串進行日期格式化
注意要保證輸入的字符串跟日期時間格式一致。

1 sqlite> select strftime('%Y-%m-%d','2013-01-10');
2 2013-01-10
3 
4 sqlite> select strftime('%Y-%m-%d','2013-1-1');
5 
6 sqlite> select strftime('%Y-%m-%d','2013,1,1');

在Python中使用從SQLite獲取的datetime對象
    關於Python的日期時間函數,大家可以搜索相關的文章,或者直接查看Python的說明文檔。這里只簡單提一下Python的datetime對象都支持什么操作。

datetime2 = datetime1 + timedelta
datetime2 = datetime1 - timedelta
timedelta = datetime1 - datetime2
datetime1 < datetime2
在datetime對象上進行加減,但是注意必須是 timedelta 對象。

    最后,日常使用中可能會從SQLite中獲取 datetime 類型的數據,但是從SQLite中得到數據在Python將會是一個str對象。
所以,必須使用datetime模塊的strptime轉換一下:

1 conn = sqlite3.connect(db)
2 c = conn.cursor()
3 rows = c.execute("SELECT DISTINCT(datetime(julianday(ins_time))) FROM items ORDER BY ins_time DESC LIMIT 0,1")
4 for row in rows:
5     result = datetime.strptime(row[0], "%Y-%m-%d %H:%M:%S")

 

參考:

strftime() 可以使用以下的符號對日期和時間進行格式化:
%d 一個月中的第幾 0-31
%f 小數形式的秒 SS.SSSS
%H 小時 00-24
%j 一年中的第幾天 01-366
%J Julian Day Number
%m 月份 01-12
%M 分鍾 00-59
%s 從1970-01-01日開始計算的秒數
%S 秒 00-59
%w 星期 0-6,0代表星期天
%W 一年中的第幾周 00-53
%Y 年份 0000-9999
%%% 百分號

 

結合上面的格式化符號,可以使用strftime()來表示另外幾個函數:

date(...)  -->  strftime("%Y-%m-%d", ...)
time(...)  -->  strftime("%H:%M:%S", ...)
datetime(...)  -->  strftime("%Y-%m-%d %H:%M:%S", ...)
julianday(...)  -->  strftime("%J", ...)

 

將時間初始化的幾個修正符:

start of year
start of month
start of week
start of day

以上幾個修正符會分別將年、月、星期、日初始化。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM