Oracle数据库时间类型悬疑案
这次遇到的问题小Alan其实一年半前做证券行业项目就已经遇到过,但是一直没有去思考是什么原因导致的这样的悬疑案,悬疑案是什么呢?其实很简单,我想有不少童鞋都有用到Oracle数据库,情形是这样子的,这是我们做电商平台常见的订单表中包含的两个字段:


如图,随便拿两个时间举例,一个是买家提交订单的时间,一个是卖家确认订单的时间,我们来看一条数据,它是这样子的:

大家看数据,没毛病吧,两个日期格式是一模一样的,采用的都是TIMESTAMP(6)类型的时间格式,DATE也是比较常用的类型,如果需要更精确可以考虑使用TIMESTAMP类型,那么问题出在哪里呢?我们通过测试工具jmeter向后端发送一个订单详情接口的请求:

返回的数据如下:

当小Alan看到禅道上面测试mm提的Bug时心是绝望的,what?fuck?shit?这是什么鬼?果不其然,过了没多久做ios的哥们就找上门来了?为什么你提交订单的时间是年月日时分秒,而确认订单的时间又是毫秒数?我fuck your...但是经过小Alan的三寸会烂之舌,做ios的哥们很配合的自己格式化去了,真不是小Alan懒哦,而是做H5和Android的哥们已经自己格式化了,大家要统一开发风格嘛,O(∩_∩)O哈哈哈~
但是懒是阻止不了小Alan的求知欲望的,于是仔细的去看了看代码当中的玄妙之处,秒秒钟还是找到了问题所在,上面还在说大家要统一开发风格,结果自己还真没有统一开发风格,好尴尬,咳...咳...咳...
问题出在哪呢?接下来为大家揭晓:
我们先看看提交订单的sql语句(Sql语句太长,简单截取表示):

这里用到的是orm框架Mybatis,大家可以发现orderTime是通过实体类传过来的,再来看看给它赋值的代码部分:

这说明了什么?说明提交订单的时间是通过java.util.Date类型的无参构造函数得到的当前系统时间,有毛病吗?当然没毛病!我们再来看看确认订单的时间又是怎么来的呢?我们来到确认订单的接口:

小Alan找了半天硬是没找到在哪给的确认订单的时间,这就是问题所在了,提交订单是另一个做Java的哥们开发的接口,确认订单呢是我开发的接口?这不明摆着没有统一开发风格么,咳...咳...咳...好尴尬啊!小Alan就想这里没有给时间那数据库怎么会有确认订单的时间?于是继续往下走来到了sql语句:

原来确认订单的时间是这么子来的?直接用的oracle数据库服务器的当前系统时间sysdate,经过这么一出,于是数据的数据是这样子的:

这尼玛有毛病吗?就是没毛病!但是接口返回的数据的的却却有毛病!小Alan就给大家揭晓到这里,别问小Alan到底是不是这个原因导致的,小Alan比较懒没有验证过,闲着没事的可以去验证一下,如果不是这么回事记得在下面评论就好,别打小Alan,小Alan拿个碗到街上乞讨都没人打发点,就不要再伤害小Alan幼小的心灵了。
结束语:就是没毛病。
可爱博主:AlanLee
博客地址:http://www.cnblogs.com/AlanLee
本文出自博客园,欢迎大家加入博客园。
Oracle数据库时间类型悬疑案的更多相关文章
- oracle 数据库时间类型为字符串 时间范围大小查询
select * from invoicedetail t2 where t2.Memo is null and to_char(to_date(t2.PrintDate,'yyyy-MM-dd hh ...
- Oracle数据库date类型与Java中Date的联系与转化
以下是对Java中的日期对象与Oracle中的日期之间的区别与联系做点说明,以期对大家有所帮助.new Date():分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),就是系统当前 ...
- 数据库时间类型是 datetime 类型的处理
当数据库时间类型是datetime类型时,获取前台时间是要这样处理 ,因为数据库是把时间转换为字符类型来比较的 sb.Append(" and Date <=convert(varch ...
- Oracle数据库字段类型说明
目前Oracle 数据库大概有26个字段类型,大体分为六类,分别是字符串类型.数字数据类型.日期时间数据类型.大型对象(LOB)数据类型.RAW和LONG RAW数据类型.ROWID和UROWID数据 ...
- 关于EJB 时间注解与oracle数据库时间格式
EJB中Temporal是时间注解,其中TemporalType是时间注解的枚举类型其中包括 TemporalType类型,请看源码/*** Type used to indicate a speci ...
- Oracle 数据库字段类型使用说明
简介 目前Oracle 数据库大概有26个字段类型,大体分为六类,分别是字符串类型.数字数据类型.日期时间数据类型.大型对象(LOB)数据类型.RAW和LONG RAW数据类型.ROWID和UROWI ...
- oracle之时间类型
Oracle 时间类型及Timezone 20.1 Oracle的六种时间类型 DATETIMESTAMPTIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TI ...
- oracle数据库数值类型
---恢复内容开始--- 内容摘自网络 Oracle的数值类型有int,number,float,decimal,numberic等. NUMBER类型 定义 定义格式NUMBER (prec ...
- 修改oracle数据库时间
1.修改前需要先停止 oracle 数据库服务 2.修改 oracle 数据库所在的服务器时间 3.再次启动 oracle 数据库,即可 以上就是小编修改 oracle 数据库的时间,修改完之后,其他 ...
随机推荐
- RabbitMQ-从基础到实战(4)— 消息的交换(下)
0.目录 RabbitMQ-从基础到实战(1)- Hello RabbitMQ RabbitMQ-从基础到实战(2)- 防止消息丢失 RabbitMQ-从基础到实战(3)- 消息的交换(上) 1.简介 ...
- Mac系统安装nginx+rtmp模块
1.安装命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install) ...
- Android自学反思总结(中)
后来在导员的推荐加上自己的好奇心给电脑装上了Ubuntu,因为Android的内核就是Linux,导员想让我们及早接触,及早熟悉,这也是我后来一直冷落Windows的原因,装Ubuntu的过程是艰辛的 ...
- iOS开发之Segue
Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue). 每一个Segue对象,都有3个属性: (1)唯一标识 @property (nonat ...
- iwebshop里面传数组且输出
//php后台 $starttimestr = $arr[0]['forea_time']; $endtimestr = $arr[0]['end_time']; $data['starttime'] ...
- iOS 10 语音识别Speech Framework详解
最近做了一个项目,涉及到语音识别,使用的是iOS的speech Framework框架,在网上搜了很多资料,也看了很多博客,但介绍的不是很详细,正好项目做完,在这里给大家详解一下speech Fram ...
- Unity3d在Window上使用SAPI进行语音识别
前言 在之前<Unity利用Sapi进行windows语音开发>中,本计划不准备继续做语音识别.因为在unity3d中已经提供了语音识别的相关方法,详见unity3d的官方文档:https ...
- CentOS7.2 初始化
##安装wget,linux默认最小版本不会安装wget yum -y install wget ##安装文件上传下载到服务器的小工具 yum -y install lrzsz ##安装网络工具包 y ...
- mysql 分析5语句的优化--索引添加删除
查看表的索引 show create table 表名; show index from 表名; show keys from表名; 添加索引 alter table 表名 add index 索 ...
- c++中enum的用法——枚举类型
将变量的可取值全部列举出来,写在程序的开头,使用该类型的时候显示地指定取值即可(即对枚举变量进行赋予元素操作,这里之所以叫赋元素操作不叫赋值操作就是为了说明枚举变量是不能直接赋予算数值的). 如: e ...