问题描述
--创建表CREATETABLEReturnGoodsMains(ReturnSysIDVARCHARNOTNULL,ReturnDateVARCHAR,PRIMARYKEY(ReturnSysID));--添加数据insertintoReturnGoodsMains(ReturnSysID,ReturnDate)values('63X01105030497201212020001','2012-12-216:14:49');insertintoReturnGoodsMains(ReturnSysID,ReturnDate)values('63X01105030497201212020002','2012-12-116:15:43');insertintoReturnGoodsMains(ReturnSysID,ReturnDate)values('63X01105030497201212020003','2012-12-916:16:12');insertintoReturnGoodsMains(ReturnSysID,ReturnDate)values('63X01105030497201212020004','2012-12-616:18:18');insertintoReturnGoodsMains(ReturnSysID,ReturnDate)values('63X01105030497201212020005','2012-12-916:19:30');insertintoReturnGoodsMains(ReturnSysID,ReturnDate)values('63X01105030497201212020006','2012-12-916:20:01');问题来了:select*fromReturnGoodsMainswheredatetime(ReturnDate)>='2012-12-200:00:00'anddatetime(ReturnDate)<'2012-12-300:00:00';执行后无结果;select*fromReturnGoodsMainswhereReturnDate>='2012-12-200:00:00'andReturnDate<'2012-12-300:00:00';执行后显示结果:63X011050304972012120200012012-12-216:14:49正确select*fromReturnGoodsMainswhereReturnDate>='2012-12-200:00:00'andReturnDate<'2012-12-1000:00:00';执行后没有结果。请问大家这是怎么回事,弄两天了就是查不出来。
解决方案
解决方案二:
VARCHAR上进行>=等时间比较是不可靠的,
解决方案三:
引用1楼stonespace的回复:
VARCHAR上进行>=等时间比较是不可靠的,
就算是datetime类型的也是一样,我试过了。。。
解决方案四:
会不会是2012-12-200:00:00这种格式不符合要求,sqlite中yyyy-MM-ddHH:mm:ss才被识别为日期,也就是说月份和日都需要2位才行。
解决方案五:
你写成:select*fromReturnGoodsMainswheredatetime(ReturnDate)>='2012-12-0200:00:00'anddatetime(ReturnDate)<'2012-12-0300:00:00';试试。
解决方案六:
'2012-12-0300:00:00'转成datetime类型在比较试试,应该是时间格式问题
解决方案七:
把时间类型转换为varchar类型的呢select*from#tablewherevarchar(16,getdate(),120)between'2012-12-0200:00'and'2012-12-1000:00'
解决方案八:
把时间类型转换为varchar类型的呢写错了,更正,呵呵select*from#tablewhereCONVERT(varchar(16),getdate(),120)between'2012-12-0200:00'and'2012-12-1000:00'
解决方案九:
select*fromReturnGoodsMainswheredatetime(ReturnDate)>=datetime('2012-12-200:00:00')anddatetime(ReturnDate)<datetime('2012-12-300:00:00')这样试下,应该能返回数据select*fromReturnGoodsMainswhereReturnDate>='2012-12-200:00:00'andReturnDate<'2012-12-1000:00:00';执行后没有结果这个是因为你数据库中存放的是字符串,而对于字符串的比较是按字母一个一个比较的,而字母'2012-12-2中的2大于'2012-12-1中的1所以查询不出数据来
解决方案十:
要把时间转换格式,以前我遇到过这个问题。本想发源码但没找到那个项目,
解决方案十一:
用日期时间型不要用nvarchar
解决方案十二:
引用3楼dalmeeme的回复:
会不会是2012-12-200:00:00这种格式不符合要求,sqlite中yyyy-MM-ddHH:mm:ss才被识别为日期,也就是说月份和日都需要2位才行。http://www.sqlite.org/lang_datefunc.html
DateTimedt=Convert.ToDateTime("2012-12-300:00:00");1.dt.ToString("yyyy-MM-ddHH:mm:ss")2.dt.ToString("s")这样试试再不行就看看你sqlite那个IED里的时间格式是什么
解决方案十三:
解决方案十四:
以上结果Sqlite3.0
解决方案十五:
select*fromReturnGoodsMainswhereCONVERT(datetime,ReturnDate)>='2012-12-200:00:00'andCONVERT(datetime,ReturnDate)<'2012-12-300:00:00';select*fromReturnGoodsMainswhereReturnDate>='2012-12-200:00:00'andReturnDate<'2012-12-300:00:00';select*fromReturnGoodsMainswhereReturnDate>='2012-12-200:00:00'andReturnDate<'2012-12-1000:00:00';前2中可以查出一条数据,最后一种不能查出数据。原因是:ReturnDate的类型是varchar,也就是字符串了,那如果是字符串比较,这这样whereReturnDate>='2012-12-200:00:00'andReturnDate<'2012-12-1000:00:00'就绝对查不出数据的,字符串比较的时候会先从第一个字符比较,如果第一个字符相等,则就比较第2个字符,以此类推,ReturnDate<'2012-12-1000:00:00'当比较到‘2012-12-’的时候前面都有匹配的,则开始比较1,由于此时数据库中是不存在比“2012-12-1”还小的数据,所以就查不出。
解决方案:
select*fromReturnGoodsMainswheredatetime(ReturnDate)>=datetime('2012-12-0200:00:00')anddatetime(ReturnDate)<datetime('2012-12-0300:00:00')
解决方案:
`还有你2号3号之间没数据换个数据就好了~还有就是日期格式必须是012-12-0216:14:49而不是2012-12-216:14:49少个0`~~~~~太囧了~
解决方案:
用SQLiteManager可以查出来,用程序就不行(以前是可以的,代码没有变过)selectsource,equipId,opaId,icuaId,[time],updateTime,status,otherInfo,data,ReturnValuefromCollectDatawhereupdateTime>="2014-12-2500:00:00"andupdateTime<"2014-12-2511:45:00"OrderByupdateTimedesclimit1000