背景 |
最近在维护NCRE教师端,发现一个问题:数据库中的日期是字符串格式的,可是为什么字符串类型的数据也可以比较大小呢?以下是两种比较方式:
一、用字符串比较 |
这个方法很容易想到,就是纯粹地利用字符串来比较大小,比如有一个字段为adddate,其数据类型为varchar,要比较这个日期是不是大于某个日期,比如”2016-2-22”,那么可以直接写:where adddate>’2016-02-22’,这种方法很直观,当然也需要在格式上有所规范,比如,如果日期是2016年2月22日,就必须将日期保存为2016-02-22,否则比较的时候容易出错。
再举一个更直观的例子:从一个表中查询一个范围内的CollegeID,CollegeID从01–14,执行如下sql语句,结果如下:
SELECT
*
FROM
StudentBindPaperTypeEntity
WHERE
CollegeID BETWEEN '10'
AND '7'
讲解:比较范围:10—7
1.以01为例:为什么没有查出次数据?10vs01,相应的字符串进行比较,第一位:1vs0,1比0大,所以10比01大,所以01没有被查询出来
2.以14为例,为什么会出现在查询结果中?
(1)10vs14
第一位:1vs1,两个相同,所以比较第二位
第二位:0vs4,4比0大,所以14>10,14通过第一个数比较,与第二数进行比较
(2)7vs14
第一位:7vs1,7>1,所以7>14
(3)综上:所以14在10–7的范围内
总结
我们明显可以看出,上面的比较用我们对数字的比较方法来说结果是错误的,因为在10–7这个范围内是没有数字的,可是为什么字符串类型的时间比较没有问题呢?因为相比较的时间的两个格式是相同的,所以结果正确,但是如果时间没有设置成相同的,那么结果就很有很有肯呢个发生问题,所以一般情况下不要使用这样的方法。
二、通过转换函数 |
利用Sql提供的日期转换函数:CONVERT ([ length ], [, style])
1)data_type为SQL Server系统定义的数据类型,用户自定义的数据类型不能在此使用。
2)length用于指定数据的长度,缺省值为30。
3)用CONVERT() 函数的style 选项能以不同的格式显示日期和时间。style 是将DATATIME 和SMALLDATETIME 数据转换为字符串时所选用的由SQL Server 系统提供的转换样式编号,不同的样式编号有不同的输出格式。如果用这种方法来判断某一个字段的话,则存入的日期字段的字符串格式只要是能让sql server完成对日期的转换就可以了,而不一定要像第一种方法中的那样严格。还是说adddate字段,比如要比较它是否大于当前的日期,就可以这样写:where (CONVERT(varchar, adddate) >= CONVERT(varchar, GETDATE())) 。
总结 |
以前从来没有思考过这个问题,这是一个学姐提出来的,可是很多东西不怕不知道就怕不知道。
第一点:看到两个日期进行比较的时候,我从来没有更深入的思考过,觉得这样比较就是理所当然呀,没有什么问题。
第二点:从来没有遇到过类似的问题,为什么学姐就可以思考这个问题呢?学姐思考的多是一方面,另一方面就是可能学姐之前遇到过类似的东西 ,所以扩展自己的接触面也是非常重要的一点。
转载:https://blog.csdn.net/Sunny5319/article/details/79375651