SQLServer---查询过程中的数据类型转化

前两天在维护某市人才服务中心的人事档案管理系统的时候,发现了这个一个问题新的档案编号规则是日期+已有档案最大编号+1(六位,不足六位在中间补零)(((CONVERT([varchar](9),[createTime],(112))+'')+right((100000000000.)+[num],(6))))例如:20150511007841。说实话真的不清楚当时为什么会用最大编号,而不是用总记录数+1(不存在删除数据),接下来说说遇到的问题,以及解决方法吧。


问题再现


查询表中总记录数+1

select count(number)+1 from T_UniversityStudent

执行结果


查询表中最大数据+1

select MAX(number)+1fromT_UniversityStudent

执行结果


问题原因


为什么明明数据库中有了7840条数据,而数据记录是每次加1,那为什么会造成这中问题呢?

我想有经验的开发者,已经知道了,是不是数据类型有问题了。在字符串的大小比较中9>1000是成立的,也就是说999>7840也是正确的。

我们通过排序来验证是否上述的说法是正确的

select number from T_UniversityStudentorderbynumber asc

执行结果


问题解决


既然我们已经知道了是字段设计的过程中存在问题,那么我们最简单的就是讲字段的数据类型改了,但由于我们不了解修改数据类型之后会不会造成不良的后果,因此这种方法并不是最好的。

这时我们就能用到cast函数和convert函数了。

具体的用法如下

通过将varchar类型转化成int类型排序(使用convert函数)

select number from T_UniversityStudentorderbyconvert(int,number)asc

执行结果


将查询字段中的varchar转换成int

select MAX(cast(numberasint))+1fromT_UniversityStudent

执行结果


需要注意的是convert函数只能运用在SQLServer中而cast函数可以用在oracle和SQL Server中,至于其他数据库中是否支持还需要读者自己尝试了。

更多相关文章

  1. MySQL字符串相加函数如何运行?似曾相识还是记一笔吧
  2. mysql自定义排序规则函数——field()
  3. Oracle 00932. 00000 - “不一致的数据类型:预期%s获得%s”
  4. oracle基础知识总结 part 3 : 三范式,PLSQL,存储过程,函数,触发器
  5. sql 内置函数 获取表的 列名
  6. Java se之静态代码块、代码块、构造函数执行顺序问题
  7. 关于JAVA回调函数的使用
  8. 如何在函数中将两个参数从1个类传递给另一个?
  9. 回调函数在Android监听机制中的体现

随机推荐

  1. Android中的Message类以及Java对象池的实
  2. 2011.09.07——— android zxing 条形码
  3. android 9.0 增加实体按键的按键声音,以及
  4. android 创建快捷方式图标
  5. android源码分享之蓝虫火车票余票查询源
  6. android与webservice通信之中文乱码问题!
  7. android通过shape.xml制作渐变背景
  8. Android listview中使用button解决方法
  9. android apilevel和android系统版本对应
  10. Android动态壁纸开发