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 数据库的时间,修改完之后,其他 ...
随机推荐
- VMware10虚拟机安装mac os x 10.9
身边越来越多盆友们购进mac本子,不断地诱惑着小编,近日一直想着买一台mac本子装逼,后来想想用来开发(非ios)可能会遇着各种问题,就先在虚拟机上玩玩看,毕竟1,2万RMB不是小数. 在mac os ...
- FastCGI超过活动超时时间
线上环境:PHP5.4 and IIS 打开IIS管理器,找到FastCGI,打开后编辑选项 活动超时默认为70(秒) 请求超时默认为90(秒) 可根据项目需求来更改这两项的值
- (20)IO流之SequenceInputStream 序列流
序列流,对多个流进行合并. SequenceInputStream 表示其他输入流的逻辑串联.它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直 ...
- [译]Selenium Python文档:三、导航控制
你使用WebDriver要做的第一件事就是访问一个链接.一般通过调用get方法来实现: driver.get("http://www.baidu.com") 在将控制权返给你的脚本 ...
- pcntl_fork 导致 MySQL server has gone away 解决方案
pcntl_fork 前连数据库,就会报 MySQL server has gone away 错误.原因是子进程会继承主进程的数据库连接,当mysql返回数据时,这些子进程都可以通过这个连接读到数据 ...
- 零基础入门学习UI设计指南
第一步:认识设计启蒙必备知识 学习一项技能,尤其是已经有一定沉淀并在各行各业有广泛应用的技能,就一定要对它先有充分的认知.在开始正式学习前,你需要花足够的经历去了解和查阅它的起源.发展.应用.未来. ...
- MCMC(二)马尔科夫链
MCMC(一)蒙特卡罗方法 MCMC(二)马尔科夫链 MCMC(三)M-H采样和Gibbs采样(待填坑) 在MCMC(一)蒙特卡罗方法中,我们讲到了如何用蒙特卡罗方法来随机模拟求解一些复杂的连续积分或 ...
- 自适应的tab菜单栏
代码部分: Css代码:*{ margin:0px; padding:0px; font-size:62.5%;}body{ background-color:#FFFFFF;}.zw-test-ti ...
- iOS 应用关于弥补安全优化问题
1.log输出会被中奖者截获,暴露信息,影响app得性能 在工程里面的pch文件加入以下代码 // 调试状态 #define LMLog(...) NSLog(__VA_ARGS__) #else / ...
- Java面向对象核心技能
1.封装 封装是面向对象的三大特性之一,就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而通过该类提供的方法来实现对隐藏信息的操作和访问. 封装的好处:隐藏类的实现细节:让使用者只能通过程序规 ...