sqlite数据库处理时间问题
首先,sqlite数据库在时间处理上和sqlserver还有oracle不同,下面根据自己做过的实例总结一下.
创建了一个Log数据表:
LogID | SourceID | OperatorID | LogType | LogLevel | LogTime | LogContent |
1 | aaa.aspx | 0 | 2 | 1 | 2011-08-18 16:44:32.000 | aaaa |
2 | bbb.aspx | 1 | 2 | 2 | 2011-08-18 16:38:32.000 | bbbb |
3 | ccc.aspx | 2 | 3 | 3 | 2011-09-02 | cccc |
4 | ddd.aspx | 3 | 1 | 4 | 2011-08-15 | dddd |
5 | eee.aspx | 4 | 1 | 3 | 2011-08-18 | eee |
普通的sqlserver的查询语句如下:select * from Log where LogTime='2011-09-02'可以查询出"'2011-09-02"的数据。
而在sqlite数据库中,写上面的语句,查询不到任何数据;说明sqlserver于sqlite对于时间处理上是不同的。那么如何写一条以时间为查询条件的sql语句才能在sqlite数据库中把想要的结果查询出来呢?请看::::
select * from Log where datetime(LogTime)=datetime('2011-08-18 16:38:32.000')
sqlite数据查询语句,必须对时间字段和传入的时间参数做转换.即加上datetime()转换.
执行了上面的语句,就可以得到要查找到结果。如果按照sqlserver的写法,那么是不会得到查询结果的。
另外,一些错误的查询语句如下:
1: select * from Log where datetime(LogTime)=datetime('2011-08-18'),这条语句只能查询到一条数据,就是对应LogID=5的那条,而不会得到LogID=1和LogID=2的数据。可见,sqlite对于时间是非常严格的。精确度非常高。
2:select * from Log where datetime(LogTime)=datetime('2011-8-18'),这条语句是查询不到任何结果,因为sqlite的时间要求是yyyy-MM-dd或者yyyy-MM-dd hh:mm:ss的。当月数为10以下,那么必须写成0x的形式(如:05),所以在做开发的时候一定要对入库的时间做相应处理。
3: select * from Log where datetime(LogTime)=datetime('2011-08-9'),同样的,这条语句也查询不到任何结果,应该把9改成09,就可以得到查询结果了。