澳门新浦京8455comSQLite3中的日期时间函数使用小结

复制代码 代码如下:import sqlite3conn =
sqlite3.connect(‘/tmp/sqlite.db’)cur =
conn.cursor()接下来干嘛呢?建一张表吧。这里需要注意的是,SQLite不支持在创建表的同时创建索引,所以要分两步走,先创建表然后再创建索引复制代码 代码如下:create_table_stmt =
”’CREATE TABLE IF NOT EXISTS test_table (id INTEGER PRIMARY KEY
AUTOINCREMENT,duration INTEGER,event_date TEXT,parameter TEXT );”’

SQLite日期类型

create_index = ‘CREATE INDEX IF NOT EXISTS idx_id ON test_table
(id);’cur.execute(create_table_stmt)cur.execute(create_index)conn.commit()

简单示例:

然后往里面插一点数据吧,SQLite只支持5种基本的数据类型复制代码 代码如下:NULL.The value is a NULL
value INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6,
or 8 bytes depending on the magnitude of the valueREAL.The value is a
floating point value, stored as an 8-byte IEEE floating point
numberTEXT.The value is a text string, stored using the database
encoding (UTF-8, UTF-16BE or UTF-16LE)BLOB.The value is a blob of data,
stored exactly as it was input

SELECT 
    datetime(CHANGE_DATE,’localtime’), 
    strftime(‘%Y-%m-%d’,CHANGE_DATE,’localtime’), 
    datetime(‘now’,’localtime’), 
    strftime(‘%Y-%m-%d’,’now’,’localtime’), 
    DATE(‘now’,’localtime’), 
    time(‘now’,’Localtime’), 
    time(‘2010-11-27 01:12:21′,’Localtime’,’-8 hour’) as Time 
FROM SALARY_HISTORY ;

问题来了,SQLite的时间和日期类型在哪里?原来SQLite可以把时间日期保存在一下几种数据类型里面复制代码 代码如下:TEXT as ISO8601 strings
(‘YYYY-MM-DD HH:MM:SS.SSS’).REAL as Julian day numbers, the number of
days since noon in Greenwich on November 24, 4714 B.C. according to the
proleptic Gregorian calendar.INTEGER as Unix Time, the number of seconds
since 1970-01-01 00:00:00 UTC.

SELECT * FROM SALARY_HISTORY WHERE
date(CHANGE_DATE,’Localtime’)=Date(‘now’,’Localtime’)

insert_stmt = ‘insert into test_table values (?, ?, ?)’record = (123,
‘2011-11-30 12:34:56’, ‘hello world’)cur.execute( insert_stmt, record
)conn.commit()把日期保存为字符串以后,不能直接拿出来直接当日期用,在用之前要调用SQLite的date函数例如找前一天存进去的数据:复制代码
代码如下:SELECTid,duration,event_date,parameterFROM
test_tableWHEREDATE(event_date) = DATE(‘now’, ‘-1 day’,
‘localtime’)ORDER BY id, event_date

Sqlite3支持的数据类型 
NULL 
INTEGER 
REAL 
TEXT 
BLOB 
但实际上,sqlite3也接受如下的数据类型: 
smallint 16 位元的整数。 
interger 32 位元的整数。 
decimal(p,s) p 精确值和 s
大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为
p=5; s=0 。 
float 32位元的实数。 
double 64位元的实数。 
char(n) n 长度的字串,n不能超过 254。 
varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。 
graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes,
n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。 
vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000 
date 包含了 年份、月份、日期。 
time 包含了 小时、分钟、秒。 
timestamp 包含了 年、月、日、时、分、秒、千分之一秒。

查看表结构select * from sqlite_master查看表信息PRAGMA table_info
(table_name)

SQLite包含了如下时间/日期函数: 
datetime()…………………..产生日期和时间 
date()………………………产生日期 
time()………………………产生时间 
strftime()…………………..对以上三个函数产生的日期和时间进行格式化

SQLite中的时间日期函数

datetime()的用法是:datetime(日期/时间,修正符,修正符…) 
date()和time()的语法与datetime()相同。

SQLite包含了如下时间/日期函数:复制代码
代码如下:datetime()…………………..产生日期和时间date()………………………产生日期time()………………………产生时间strftime()…………………..对以上三个函数产生的日期和时间进行格式化

在时间/日期函数里可以使用如下格式的字符串作为参数: 
YYYY-MM-DD 
YYYY-MM-DD HH:MM 
YYYY-MM-DD HH:MM:SS 
YYYY-MM-DD HH:MM:SS.SSS 
HH:MM 
HH:MM:SS 
HH:MM:SS.SSS 
now 
其中now是产生现在的时间。

datetime()的用法是:datetime(日期/时间,修正符,修正符…)date()和time()的语法与datetime()相同。

举例(写这个笔记的时间是2006年10月17日晚8点到10点,测试环境:SQLite
2.8.17,WinXP,北京时间):

在时间/日期函数里可以使用如下格式的字符串作为参数:复制代码 代码如下:YYYY-MM-DDYYYY-MM-DD
HH:MMYYYY-MM-DD HH:MM:SSHH:MMHH:MM:SSnow # 其中now是产生现在的时间。

例1. 
select datetime(‘now’); 
结果:2006-10-17 12:55:54

举例:复制代码 代码如下:select
datetime(‘now’);结果:2006-10-17 12:55:54

例2. 
select datetime(‘2006-10-17’); 
结果:2006-10-17 12:00:00

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

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

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

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

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

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

# 尽管第2个参数加上了10个小时,但是却被第3个参数 start of day
把时间归零到00:00:00#
随后的第4个参数在00:00:00的基础上把时间增加了10个小时变成了10:00:00。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

# 把格林威治时区转换成本地时区。select datetime(‘now’,
‘localtime’);结果:2006-10-17 21:21:47

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

select datetime(‘now’, ‘+8 hour’);结果:2006-10-17 21:24:45strftime()
函数可以把YYYY-MM-DD
HH:MM:SS格式的日期字符串转换成其它形式的字符串。strftime()
的语法是strftime(格式, 日期/时间, 修正符, 修正符, …)

例3中的+1 hour和-12
minute表示可以在基本时间上(datetime函数的第一个参数)增加或减少一定时间。

它可以用以下的符号对日期和时间进行格式化:%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%%百分号

例5中的start of year表示一年开始的时间。

strftime() 的用法举例如下:复制代码
代码如下:select strftime(‘%Y/%m/%d %H:%M:%S’, ‘now’,
‘localtime’);结果:2006/10/17 21:41:09

从例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

函数篇:

算术函数 
abs(X) 返回给定数字表达式的绝对值。 
max(X,Y[,…]) 返回表达式的最大值。 
min(X,Y[,…]) 返回表达式的最小值。 
random(*) 返回随机数。 
round(X[,Y]) 返回数字表达式并四舍五入为指定的长度或精度。 
字符处理函数 
length(X) 返回给定字符串表达式的字符个数。 
lower(X) 将大写字符数据转换为小写字符数据后返回字符表达式。 
upper(X) 返回将小写字符数据转换为大写的字符表达式。 
substr(X,Y,Z) 返回表达式的一部分。 
randstr() 
quote(A) 
like(A,B) 确定给定的字符串是否与指定的模式匹配。 
glob(A,B) 
条件判断函数 
coalesce(X,Y[,…]) 
ifnull(X,Y) 
nullif(X,Y) 
集合函数 
avg(X) 返回组中值的平均值。 
count(X) 返回组中项目的数量。 
max(X) 返回组中值的最大值。 
min(X) 返回组中值的最小值。 
sum(X) 返回表达式中所有值的和。 
其他函数 
typeof(X) 返回数据的类型。 
last_insert_rowid() 返回最后插入的数据的ID。 
sqlite_version(*) 返回SQLite的版本。 
change_count() 返回受上一语句影响的行数。 
last_statement_change_count()

   管理工具: 
   SQLite :

本文来自CSDN博客,转载请标明出处:

比如今天是: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日期函数详细文档: 
 
————————— 分隔线 如下收集于网络 ————- 
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

文章来自学IT网:

‍这是我学习SQLite时做的笔记,参考并翻译了Chris
Newman写的《SQLite》中的《Working with Dates and
Times》一文中的部分内容。 
SQLite包含了如下时间/日期函数: 
datetime()…………………..产生日期和时间 
date()………………………产生日期 
time()………………………产生时间 
strftime()…………………..对以上三个函数产生的日期和时间进行格式化

datetime()的用法是:datetime(日期/时间,修正符,修正符…) 
date()和time()的语法与datetime()相同。 
在时间/日期函数里可以使用如下格式的字符串作为参数: 
YYYY-MM-DD 
YYYY-MM-DD HH:MM 
YYYY-MM-DD HH:MM:SS 
YYYY-MM-DD HH:MM:SS.SSS 
HH:MM 
HH:MM:SS 
HH:MM:SS.SSS 
now 
其中now是产生现在的时间。 
举例(写这个笔记的时间是2006年10月17日晚8点到10点,测试环境:SQLite
2.8.17,WinXP,北京时间): 
例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用圆点作为日期的分隔附,并把时间转换为当地的时区的时间。 
更多关于SQLite日期时间函数方面的内容,可以参考Chris
Newman写的《SQLite》(ISBN:0-672-32685-X)中的《Working with Dates
and 
Times》一文

转自:

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图