这次遇到的问题小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数据库时间类型悬疑案的更多相关文章

  1. oracle 数据库时间类型为字符串 时间范围大小查询

    select * from invoicedetail t2 where t2.Memo is null and to_char(to_date(t2.PrintDate,'yyyy-MM-dd hh ...

  2. Oracle数据库date类型与Java中Date的联系与转化

    以下是对Java中的日期对象与Oracle中的日期之间的区别与联系做点说明,以期对大家有所帮助.new Date():分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),就是系统当前 ...

  3. 数据库时间类型是 datetime 类型的处理

    当数据库时间类型是datetime类型时,获取前台时间是要这样处理 ,因为数据库是把时间转换为字符类型来比较的 sb.Append(" and Date <=convert(varch ...

  4. Oracle数据库字段类型说明

    目前Oracle 数据库大概有26个字段类型,大体分为六类,分别是字符串类型.数字数据类型.日期时间数据类型.大型对象(LOB)数据类型.RAW和LONG RAW数据类型.ROWID和UROWID数据 ...

  5. 关于EJB 时间注解与oracle数据库时间格式

    EJB中Temporal是时间注解,其中TemporalType是时间注解的枚举类型其中包括 TemporalType类型,请看源码/*** Type used to indicate a speci ...

  6. Oracle 数据库字段类型使用说明

    简介 目前Oracle 数据库大概有26个字段类型,大体分为六类,分别是字符串类型.数字数据类型.日期时间数据类型.大型对象(LOB)数据类型.RAW和LONG RAW数据类型.ROWID和UROWI ...

  7. oracle之时间类型

    Oracle 时间类型及Timezone 20.1 Oracle的六种时间类型 DATETIMESTAMPTIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TI ...

  8. oracle数据库数值类型

    ---恢复内容开始--- 内容摘自网络 Oracle的数值类型有int,number,float,decimal,numberic等. NUMBER类型   定义   定义格式NUMBER (prec ...

  9. 修改oracle数据库时间

    1.修改前需要先停止 oracle 数据库服务 2.修改 oracle 数据库所在的服务器时间 3.再次启动 oracle 数据库,即可 以上就是小编修改 oracle 数据库的时间,修改完之后,其他 ...

随机推荐

  1. 10分钟精通SharePoint-搜索

    大势所趋随着企业内容和文档数量的骤增,快速定位到所需材料和内容已经迫不及待,这也是所有企业所面临的共同的挑战,应这个大的趋势,"搜索"闪亮登上了企业协作(SharePoint)舞台 ...

  2. Android + OpenCV - Finding extreme points in contours

    原文链接:http://answers.opencv.org/question/134783/android-opencv-finding-extreme-points-in-contours/ 导 ...

  3. ASP.NET Core MVC之ViewComponents(视图组件)

    前言 大概一个来星期未更新博客了,久违了各位,关于SQL Server性能优化会和ASP.NET Core MVC穿插来讲,如果你希望我分享哪些内容可以在评论下方提出来,我会筛选并看看技术文档来对你的 ...

  4. JVM中GC浅解:垃圾回收的了解

    1.为什么要有GC 没有GC的世界,我们需要手动进行内存管理,但是内存管理是纯技术活,又容易出错.但是我们写码的目的是为了解决业务问题,所以可以把这种纯技术活自动化,当然自动化也是有代价的. 2.垃圾 ...

  5. windows系统解决github.com访问超时

    当github无法访问时,可以尝试在hosts文件中添加下面的内容 windows:c:\windows\system32\drivers\etc 192.30.252.131 https://git ...

  6. 【Java基础】通过getResourceAsStream() 加载资源文件

    Class.getResourceAsStream(String path) path不以"/"开头时,默认是从当前类所在的包下面获取资源 path以"/"开头 ...

  7. Android 使用纯Java代码布局

    java布局 java代码布局和xml布局的区别 1.Java纯布局更加的灵活,比如自定义控件或一些特殊要求时,使用java代码布局 2.常用的xml布局是所见即所得的编写方式,以及xml本身拥有一些 ...

  8. 妈妈再也不用担心我的移动端了:网易和淘宝的rem方案剖析

    从博主学习前端一路过来的经历了解到,前端移动开发是大部分从PC端转战移动端的小伙伴都非常头疼的一个问题,这边博主就根据一篇自己看过的移动开发文章来剖析一下网易和淘宝的rem解决方案,希望能够帮助到一些 ...

  9. JavaScript对象的深浅复制

    前言 从层次上来看,对象的复制可以简单地分为浅复制和深复制,顾名思义,浅复制是指只复制一层对象的属性,不会复制对象中的对象的属性,对象的深复制会复制对象中层层嵌套的对象的属性. 在复制对象时,除了要复 ...

  10. java之泛型解说

    1.集合中只能装入引用数据类型,不能装入基本数据类型.如,装入int类型的数值123会自动装箱. 2.开发人员装入集合的数据类型不确定,所以它被设计成可以装入所有的Object. 3.新的问题产生,装 ...