sqlite 時間字段 自動時間值

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

上述五個函數需要一個日期時間字符串做參數,後面可以跟零到多個修正符參數。而 strftime() 函數還需要一個日期時間格式字符串做第一個參數。

date() 函數返回一個以 “YYYY-MM-DD” 爲格式的日期;
time() 函數返回一個以 “YYYY-MM-DD HH:MM:SS” 爲格式的日期時間;
julianday() 函數返回一個天數,從格林威治時間公元前4714年11月24號開始算起;
strftime() 函數返回一個經過格式話的日期時間,它可以用下面的符號對日期和時間進行格式化:

%d 一月中的第幾天 01-31
%f 小數形式的秒,SS.SSSS
%H 小時 00-24
%j 一年中的第幾天 01-366
%J Julian Day Numbers
%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”,…)

日期時間字符串可以用以下幾種格式:

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
DDDD.DDDD

在第五種到第七種格式中的“T”是一個分割日期和時間的字符;第八種到第十種格式只代表2000-01-01日的時間,第十一種格式的’now’表示返回一個當前的日期和時間,使用格林威治時間(UTC);第十二種格式表示一個 Julian Day Numbers。

修正符

日期和時間可以使用下面的修正符來更改日期或時間:

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 week
10.start of day
11.weekday N
12.unixepoch
13.localtime
14.utc

前六個修正符就是簡單的增加指定數值的時間和日期;第七到第十個修正符表示返回當前日期的開始;第十一個修正符表示返回下一個星期是N的日期和時間;第十二個修正符表示返回從1970-01-01開始算起的秒數;第十三個修正符表示返回本地時間。

下面舉一些例子:

計算機當前時間
SELECT date(‘now’)

計算機當前月份的最後一天
SELECT date(‘now’,’start of month’,’+1 month’,’-1 day’)

計算UNIX 時間戳1092941466表示的日期和時間
SELECT datetime(‘1092941466’,’unixepoch’)

計算 UNIX 時間戳1092941466 表示的本地日期和時間
SELECT datetime(‘1092941466’,’unixepoch’,’localtime’)

計算機當前UNIX 時間戳
SELECT strftime(‘%s’,’now’)

兩個日期之間相差多少天
SELECT jolianday(‘now’)-jolianday(‘1981-12-23’)

兩個日期時間之間相差多少秒
SELECT julianday('now')*86400 - julianday('2004-01-01 02:34:56')*86400

計算今年十月份第一個星期二的日期
SELECT date('now','start of year','+9 months','weekday 2');

得到年
strftime(‘%y’,'2008-4-28')

得到月
strftime(‘%m’,'2008-4-28')

同樣,我們也可以通過strftime來得到其它所要的信息,但是要記得,給時間加引號

例1.
select datetime('now');
結果:2006-10-17 12:55:54

例2.
select datetime('2006-10-17');
結果:2006-10-17 12:00:00

例3.
select datetime('2006-10-17 00:20:00','+1 hour','-12 minute');
結果:2006-10-17 01:08:00

例4.
select date('2006-10-17','+1 day','+1 year');
結果:2007-10-18

例5.
select datetime('now','start of year');
結果:2006-01-01 00:00:00

例6.
select datetime('now','start of month');
結果:2006-10-01 00:00:00

例7.
select datetime('now','start of day');
結果:2006-10-17 00:00:00

例8.
select datetime('now','+10 hour','start of day','+10 hour');
結果:2006-10-17 10:00:00

例9.
select datetime('now','localtime');
結果:2006-10-17 21:21:47

例10.
select datetime('now','+8 hour');
結果:2006-10-17 21:24:45

例3中的+1 hour和-12 minute表示可以在基本時間上(datetime函數的第一個參數)增加或減少一定時間。

例5中的start of year表示一年開始的時間。

從例8可以看出,儘管第2個參數加上了10個小時,但是卻被第3個參數“start of day”把時間歸零到00:00:00,隨後的第4個參數在00:00:00
的基礎上把時間增加了10個小時變成了10:00:00。

例9把格林威治時區轉換成本地時區。

例10把格林威治時區轉換成東八區。

strftime()函數可以把YYYY-MM-DD HH:MM:SS格式的日期字符串轉換成其它形式的字符串。strftime()的語法是strftime(格式, 日期/時間, 修正符, 修正符, ...)

它可以用以下的符號對日期和時間進行格式化:

%d 月份, 01-31
%f 小數形式的秒,SS.SSS
%H 小時, 00-23
%j 算出某一天是該年的第幾天,001-366
%m 月份,00-12
%M 分鐘, 00-59
%s 從1970年1月1日到現在的秒數
%S 秒, 00-59
%w 星期, 0-6 (0是星期天)
%W 算出某一天屬於該年的第幾周, 01-53
%Y 年, YYYY
%% 百分號

strftime()的用法舉例如下:
例11.
select strftime('%Y.%m.%d %H:%M:%S','now','localtime');
結果:2006.10.17 21:41:09

例11用圓點作爲日期的分隔附,並把時間轉換爲當地的時區的時間

在做ClinicOS的時候遇到一個問題,在保存病歷登記時間時,我使用了“CURRENT_TIMESTAMP”,但這有個問題,它返回的是UTC Time,這對我們中國人沒啥用,

Where julianday(date('now', 'localtime')) - julianday(date(arrival_date)) > 7
嘿嘿,看來如果想得到一個符合本機區域設置的當前時間,必須用date函數來轉換,
但date只函數只返回當前日期,而我需要的是返回當前日期及時間,所以這裏把它換成datetime函數,即:
datetime(CURRENT_TIMESTAMP,'localtime')
以下是sqlite下測試的輸出信息:
sqlite> select CURRENT_TIMESTAMP;
2006-06-18 09:23:36
sqlite> select datetime(CURRENT_TIMESTAMP,'localtime');
2006-06-18 17:23:44
sqlite>

比如今天是:200-02-22

運行如下語句所得到的結果不一樣:

select date('now')
結果:2009-02-21

select datetime('now','localtime')
結果:2009-02-22 00:52:04

所以比較時用第二種語句才取得正確結果,例如(取大於現在時間的記錄):

select * from 表 where 日期字段>datetime('now','localtime')


好象沒有MSSQL的datediff等函數

如下語句實現datediff('m',開始日期,結束日期')函數同一個數數據:

select * from 表 where strftime('%m',日期字段)=strftime('%m','now')

如此就可以實現了兩個日期相比較,舉一反三,同樣使用strftime格式式日期來對日、周、年比較

參考Sqlite日期函數詳細文檔:

http://www.xueit.com/html/2009-02/27_649_00.html

select * from Placard where Placard_EndTime > datetime('now');

Select Placard_StartTime,strftime('%s',Placard_StartTime) , datetime('now'),strftime('%s','now') FROM Placard

差8個時區...

Select Placard_StartTime,strftime('%s',Placard_StartTime) , datetime('now','localtime'),strftime('%s','now','localtime') FROM Placard

上一條:大於指定時間的第一條

select title,pubtime from article where pubtime>'2008-06-15 03:35:28' order by pubtime asc Limit 1 Offset 0

貌似時間的格式有嚴格的要求 2008-06-15 03:35:28 前面只能用 - 後面只能用:不足二位數的補零

下一條:小於指定時間的第一條

select title,pubtime from article where pubtime<'2008-06-15 03:35:28' order by pubtime desc Limit 1 Offset 0

注意時間的精度。03:35:28 後面就沒有了。

03:35:28.000


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章