当前位置: 代码迷 >> Java相关 >> 意想不到sql between 的奇怪有关问题,求大牛能解释
  详细解决方案

意想不到sql between 的奇怪有关问题,求大牛能解释

热度:164   发布时间:2016-04-22 21:08:19.0
意想不到sql between 的奇怪问题,求大牛能解释;
数据如下:
 

ID   DT  
aQYG6uOratRkXspOqQBCFQkPmoroowZb 2014-4-24
bQIHxqFlbTmFLWMQt7KZwULaIEB1MG5q 2014-4-24
ySGZZXYykWSh7ze6dt8f75nKu8xtKtjV 2014-4-24
MJwaEdceiJPuSciyx6K2x9yYwJIwDhZh 2014-4-24
u7uAZ6FkblyApdeCQQflfQoR94im1NZv 2014-4-24
EMWRgkbEGtxqxJcSM62bQwJ8Bd1ykcJq 2014-4-24

说明:dt 是以字符串(YYYY-M-D)形式存储;


问题是:
SELECT * FROM table where dt between ?1  and  ?2 ;
当?1  的日等于 3、4、5、6、7、8、9 的时候,查询不到数据;但  3>?1>10时,又可以查询到数据;
而且目前测试仅限于4月,其他月份貌似正常;
如下:
SELECT id,dt FROM TB_EQWORK where dt between '2014-3-1'  and  '2014-5-1' ; //有数据
SELECT id,dt FROM TB_EQWORK where dt between '2014-3-4'  and  '2014-5-1' ; //有数据
SELECT id,dt FROM TB_EQWORK where dt between '2014-3-20'  and  '2014-5-1' ;//有数据

SELECT id,dt FROM TB_EQWORK where dt between '2014-4-1'  and  '2014-5-1' ;//有数据
SELECT id,dt FROM TB_EQWORK where dt between '2014-4-2'  and  '2014-5-1' ;//有数据
SELECT id,dt FROM TB_EQWORK where dt between '2014-4-3'  and  '2014-5-1' ;//无数据
SELECT id,dt FROM TB_EQWORK where dt between '2014-4-9'  and  '2014-5-1' ;//无数据

SELECT id,dt FROM TB_EQWORK where dt between '2014-4-10'  and  '2014-5-1' ;//有数据
------解决方案--------------------
引用:
Quote: 引用:

你数据库dt字段的数据类型是varchar还是date的,如果是varchar的你这么弄就会有问题,要转成date类型

如果格式有问题,应该不会有结果,可是呢。。。如题。

格式问题就会有问题,varchar类型的between and的时候就会以自然顺序来判断高低的,他会从第一个字符开始从左到右以自然顺序(0-9)来比较,只要相同位置的字符自然顺序高它就认为他大例如楼主的'2014-4-3'它就是大于'2014-4-24'因为前面的’2014-4-‘都是一样的但是'2014-4-3'后面的3大于'2014-4-24'的2而不是3与24比它只会以同样位置的一个一个字符比较的。只有你的数据类型是date类型的sql server数据库时才会隐式转换
------解决方案--------------------
引用:
Quote: 引用:

你这种。。格式位数都不统一的怎么查?

你的日期位数要统一

2014-4-24改成2014-04-24

再查就没问题了


隐式转换没听过吗?如果格式有问题,应该不会有结果,可是呢。。。如题。


什么隐式转换,搞笑的吧

2014-4-24
2014-5-1
这两个字符串你告诉我哪个大哪个小?
'-'对到'2'上去了,你告诉我'-'和'2'哪个大哪个小?比出来有意义么?

2014-04-24
2014-05-01
这种对比才有意义,听说过没?