精华内容
下载资源
问答
  • 达梦数据库时间类型的使用介绍

    千次阅读 2021-02-05 22:45:43
    数据库的日常使用过程中,无论是记录服务启动时间,还是存储前端应用中的订单时间,都离不开使用各类日期类型,本文就将给大家介绍DM7中各种时间类型的区别和使用注意事项。一.DM7中时间日期类型简介DM7中常用的...

    在数据库的日常使用过程中,无论是记录服务启动时间,还是存储前端应用中的订单时间,都离不开使用各类日期类型,本文就将给大家介绍DM7中各种时间类型的区别和使用注意事项。

    一.DM7中时间日期类型简介

    DM7中常用的时间日期类型有这三种DATE,TIME,TIMESTAMP。

    DATE 类型包括年、月、日信息,定义了’-4712-01-01’和’9999-12-31’之间任何一个有效的格里高利日期。

    TIME类型包括时、分、秒信息,定义了一个在’00:00:00.000000’和’23:59:59.999999’之间的有效时间。TIME 类型的小数秒精度规定了秒字段中小数点后面的位数,取值范围为 0~6,如果未定义,缺省精度为0。

    TIMESTAMP 类型包括年、月、日、时、分、秒信息,定义了一个在’-4712-01-01 00:00:00.000000’和’9999-12-31 23:59:59.999999’之间的有效格里高利日期时间。

    TIMESTAMP 类型的小数秒精度规定了秒字段中小数点后面的位数,取值范围为 0~6,如果未定义 , 缺省精度为6。

    二.DATE和TIMESTAMP的区别

    根据上面的定义可以知道DATE类型只能存储年月日,那当我们尝试把一个完整的时间存入DATE时会发生什么呢?我们可以做如下测试:

    DECLARE

    TEST1 DATE;

    TEST2 DATE;

    BEGIN

    SET TEST1=to_date('2018-11-0115:20:10','YYYY-MM-DDHH24:MI:SS'); --存入时间1

    SET TEST2=to_date('2018-11-0117:20:10','YYYY-MM-DDHH24:MI:SS'); --存入时间2

    IF TEST1=TEST2 THEN

    PRINT'TEST1=TEST2'; --如果两个值相同则显示TEST1=TEST2

    PRINT TEST1;

    ELSEIF TEST1>TEST2 THEN

    PRINT'TEST1>TEST2';

    PRINT TEST1;

    ENDIF;

    END;

    执行结果如下:

    68ab5065565497bdbeaf491f7cbe4de5.png

    可以看到,当我们尝试把一个包含年月日时分秒毫秒的完整时间存入date类型时,年月日之外的数值会被砍掉。因此,在对两个数值进行比较时,得出来的是等号。在这种情况下,为避免数据丢失,我们需要TIMESTAMP来存储完整的日期时间信息。

    三. 从ORACLE到DM的迁移

    熟悉ORACLE的读者应该了解,ORACLE的DATE类型中包括年、月、日、时、分、秒的信息。因此,在做ORACLE到DM的数据迁移时,如果不对DATE类型做转换,则可能会导致时、分、秒数据的丢失。这时,我们应将DATE类型转化成DM中的TIMESTAMP,演示如下:

    在ORACLE中创建实例表并录入时间数据

    CREATE TABLE T1 (AAA DATE);

    INSERT INTO T1VALUES(to_date('2018-11-01 15:20:10','YYYY-MM-DD HH24:MI:SS'));

    COMMIT;

    这里我们使用DTS工具进行迁移,因篇幅关系这里就不演示过程了,迁移完成后,在DM内可以查到对应的T1表以及数据。

    702236ef124caa735f25785772ef819e.png

    表和数据已经迁移过来了,类型也被转换成了TIMESTAMP,时、分、秒的数据并没有丢失。这里,有的读者可能就会问了,为什么DATE类型自己变成了TIMESTAMP,是不是我们在迁移的过程中做了什么操作呢?

    事实上,我在迁移的过程中并没有手动指定数据类型映射。但是,当我们使用DTS进行ORACLE到DM的迁移时,DTS工具会自己对某些类型做转换。

    4459e815a0ac0a7df1e246c6ff23169f.png

    如图所示,工具已经自动将DATE类型转化成了TIMESTAMP类型。当然,迁移时类型的转换还不止图中这些,有兴趣的读者可以参考DTS帮助文档中默认数据类型映射这一章节。

    展开全文
  • 日期和时间是每系统,每个数据库设计必不可少的部分。也是容易被大家忽视的部分...最近设计新系统的数据库,涉及到跨时区的问题,于是专门调研了不同日期时间类型的利弊,也咨询了不少同行使用的情况。这里分享给大家

    日期和时间是每个系统,每个数据库设计必不可少的部分。也是容易被大家忽视的部分。很多开发者可能根本不了解以不同类型存储日期和时间意味着什么。

    有朋友可能会说,数据库定义一个datetime或timestamp类型的字段,然后在Java代码中获取当前时间并存入数据库不就可以了吗?

    Date now = new Date();
    // 调用insert或update方法创建或更新日期字段。
    

    最近设计新系统的数据库,涉及到跨时区的问题,于是专门调研了不同日期时间类型的利弊,也咨询了不少同行使用的情况。这里分享给大家。

    常见的日期时间使用情况有如下几种:字符串、Datetime、Timestamp、Unix timestamp。如果将日期和时间具体拆分细化又可包含DATE、TIME、YEAR,这部分我们这里暂且不过多讨论。

    字符串存储日期

    把日期和时间当做一个字符串进行存储,进而将日期和时间拆分成两个字段,一个字段记录日期(如yyyy-MM-dd),另外一个字段存储时间(如:HH:mm:ss)的形式。

    此种方式就不多说,除非极个别的场景,不建议使用。当使用此种方式进行处理日期,不仅性能有问题,比较、处理、取范围等都是麻烦事。

    之所以提出这种方式,也是提醒大家,如果你的数据库日期字段还在用字符串存储,需要慎重考虑一下了。

    DateTime类型

    DateTime类型存储的值既有日期又有时间。我们直观看到的格式为:yyyy-MM-dd HH:mm:ss。它支持的时间范围是“1000-00-00 00:00:00”到“9999-12-31 23:59:59”。

    但DateTime中并未存储时区信息,只存储了本地时间。也就是说:如果你将服务器的时区进行修改,数据库中记录的日期和时间并不会对应的变化。

    那么,读出的数据与新存储的数据便是不一致的,也可以说是错误的。

    通常,针对此种情况,如果涉及到跨时区问题,可考虑单独用一个字段来存储时区。

    Timestamp类型

    Timestamp类型:也是既有日期又有时间的数据。存储和显示的格式跟Datetime一样。支持的时间范围是“1970-01-01 00:00:01”到“2038-01-19 03:14:07”。

    Timestamp类型不仅存储了日期和时间,还存储了时区信息。如果以Timestamp类型存储,各数据库的实现会有所不相同,有的进行了内部时区自动转换。

    如果应用服务器的时区和数据库服务器的时区不一致,你无法确定数据库驱动程序会不会自动帮你转换。

    同时,时间范围是Timestamp硬伤。

    Unix timestamp

    由于时区问题,地球上不同地方的人看到太阳升起的时间是不一样的。比如欧洲和北京时差有6-7个小时,当早上8点在北京看到太阳时,欧洲还处于凌晨1-2点。

    除了上面所说的通过Timestamp类型存储包含时区的日期和时间外,还可以通过“绝对时间”来进行计算,单位为秒。

    在计算机中,当前时间是指从一个基准时间(1970-1-1 00:00:00 +0:00)到现在的秒数,用一个整数表示。

    在Java编程语言中我们可以通过如下两种方式(这里单位为毫秒)获取:

    System.currentTimeMillis();
    
    // 需要JDK8以上版本
    Instant.now().toEpochMilli()
    

    那么,我们只需要将表示绝对时间的时间戳通过Long类型或float类型保存到数据库中,当不同时区使用时直接格式化成对应的字符串就可以了。对应数据库类型为Bigint或float。

    关于使用绝对时间戳的好处有以下几项:

    1、数据存储的时区问题不存在了,只是一个绝对的数值。

    2、比较时也很简单,只用比较两个数值的大小或范围即可,范围可采用between(?, ?)形式的SQL。

    3、显示问题也很容易处理,各个展示端,只需要根据所在时区对数值进行转换即可,即便是JavaScript也能正常处理。

    有朋友可能会说,数据库的可读性太差。在调研时我也遇到类似的疑问,后来咨询了架构师的朋友,他说mysql提供了丰富的函数,可以进行转换。

    image

    上图中,数据库存储的是毫秒数,通过FROM_UNIXTIME函数,在查询时将其转换成指定格式即可。如果你的数据库存储的单位为秒,则在SQL中无需除以1000。

    关于日期时间的其他事项

    为了调研数据库日期和时间的设置,也参考了阿里的开发手册,令人疑惑的是阿里使用的竟然是datetime类型。

    image

    后来跟PayPal的朋友沟通之后,便豁然开朗了。他说:阿里的开发手册在我们公司只做参考。

    的确如此,毕竟每个公司的业务范围不同,使用场景也不同。优秀的理念可以参考,但不能照搬。就好比本篇文章,介绍了不同类型的日期和时间存储,而根据你的业务场景选择最适合的那便是最好的。

    我这里最终决定用绝对时间戳来进行处理。

    原文链接:《数据库的几种日期时间类型,你真的会用吗?

    精品SpringBoot 2.x视频教程

    《Spring Boot 2.x 视频教程全家桶》,精品Spring Boot 2.x视频教程,打造一套最全的Spring Boot 2.x视频教程。


    程序新视界

    公众号“ 程序新视界”,一个让你软实力、硬技术同步提升的平台

    微信公众号:程序新视界

    展开全文
  • 时间类型 数据库类型与java中类型的对应关系: DATE java.sql.Date TIME java.sql.Time TIMESTAMP java.sql.Timestamp * 领域对象(domain实体类)中的所有属性不能出现java.sql包下的东西!即不能使用java.sql...
    时间类型
       数据库类型与java中类型的对应关系:
          DATE      java.sql.Date
          TIME      java.sql.Time
          TIMESTAMP   java.sql.Timestamp
       * 领域对象(domain实体类)中的所有属性不能出现java.sql包下的东西!即不能使用java.sql.Date;
       * ResultSet#getDate()返回的是java.sql.Date()
       * PreparedStatement#setDate(int, Date),其中第二个参数也是java.sql.Date
    
       时间类型的转换:
          java.util.Date —————> java.sql.Date、 java.sql.Time、 java.sql.Timestamp
             把util的Date转换成毫秒值,使用毫秒值创建sql的Date、Time、Timestamp
             java.util.Date date = new java.util.Date();
             long longtime = date.getTime();
             java.sql.Date sqlDate = new java.sql.Date(longtime);
          java.util.Date <————— java.sql.Date、 java.sql.Time、 java.sql.Timestamp
             这一步不需要处理了,因为java.sql.Date、Time、Timestamp 都是java.util.Date的子类,可直接转型。
    
    目录
       1、Java中的时间类型
       2、时间类型相互转换
       3、代码演练
       -------------------------------------------------------
       1、Java中的时间类型
          java.sql包下给出三个与数据库相关的日期时间类型,分别是:
             Date:表示日期。如:2018-08-26,只有年月日。
             Time:表示时间。如:11:52:08,只有时分秒。
             Timestamp:表示时间戳。如:2018-08-26 11:52:08.896,有年月日时分秒,以及毫秒。
          这三个类都是java.util.Date的子类。
    
       2、时间类型相互转换
          (1)把数据库的三种时间类型赋给java.util.Date,基本不用转换,因为这是把子类对象给父类的引用,不需要转换。
             java.sql.Date date = …
             java.util.Date d = date;
    
             java.sql.Time time = …
             java.util.Date d = time;
    
             java.sql.Timestamp timestamp = …
             java.util.Date d = timestamp;
    
          (2)当需要把java.util.Date转换成数据库的三种时间类型时,这就不能直接赋值了,这需要使用数据库三种时间类型的构造器。
             java.sql包下的Date、Time、TimeStamp三个类的构造器都需要一个long类型的参数,表示毫秒值。
             创建这三个类型的对象,只需要有毫秒值即可。
             我们知道java.util.Date有getTime()方法可以获取毫秒值,那么这个转换也就不是什么问题了。
                java.utl.Date d = new java.util.Date();
                //时间的long型数据
                long longtime = d.getTime();
                //Date日期,只有年月日
                java.sql.Date date = new java.sql.Date(longtime );
                //Time时间,只有时分秒
                java.sql.Time time = new java.sql.Time(longtime );
                //Timestamp时间戳,有年月日时分秒,以及毫秒
                java.sql.Timestamp timestamp = new java.sql.Timestamp(longtime );
    
       3、代码演练
          我们来创建一个dt表:
             CREATE TABLE dt(
                d DATE,
                t TIME,
                ts TIMESTAMP
             );
          下面是向dt表中插入数据的代码:
          @Test
          public void doInsert() throws SQLException {
             //获得jdbc连接
             Connection con = JdbcUtils.getConnection();
             String sql = "insert into dt value(?,?,?)";
             //预处理绑定sql
             PreparedStatement pstmt = con.prepareStatement(sql);
    
             java.util.Date d = new java.util.Date();
             pstmt.setDate(1, new java.sql.Date(d.getTime()));
             pstmt.setTime(2, new Time(d.getTime()));
             pstmt.setTimestamp(3, new Timestamp(d.getTime()));
             pstmt.executeUpdate();
          }
    
          下面是从dt表中查询数据的代码:
          @Test
          public void doSelect() throws SQLException {
             Connection con = JdbcUtils.getConnection();
             String sql = "select * from dt";
             PreparedStatement pstmt = con.prepareStatement(sql);
             //获得结果集,默认指向beforeFirst位置。(即数据的上面)
             ResultSet rs = pstmt.executeQuery();
    
             rs.next();  //ResultSet内部行光标下移到第一条记录,便可直接操作第一行数据
             java.util.Date d1 = rs.getDate(1);
             java.util.Date d2 = rs.getTime(2);
             java.util.Date d3 = rs.getTimestamp(3);
    
             System.out.println(d1);
             System.out.println(d2);
             System.out.println(d3);
          }
    
       总结:dao层与数据库打交道,用java.sql.Date、Time、Timestamp;
          返回到service层及以上与java代码都一律转换为java.utl.Date类型。
    
    
    展开全文
  • mysql数据库:几个时间存储类型

    千次阅读 2017-07-18 15:22:13
    时间范围:[ ‘1970-01-01 00:00:00’到’2037-12-31 23:59:59’] TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 在创建新记录和修改现有记录的时候都对这数据列刷新。 TIMESTAMP DEFAUL

    一、TIMESTAMP
    显示格式:YYYY-MM-DD HH:MM:SS
    时间范围:[ ‘1970-01-01 00:00:00’到’2037-12-31 23:59:59’]
    TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 在创建新记录和修改现有记录的时候都对这个数据列刷新。
    TIMESTAMP DEFAULT CURRENT_TIMESTAMP 在创建新记录的时候把这个字段设置为当前时间,但以后修改时,不再刷新它。
    TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 在创建新记录的时候把这个字段设置为0,以后修改时刷新它。
    TIMESTAMP DEFAULT ‘yyyy-mm-dd hh:mm:ss’ ON UPDATE CURRENT_TIMESTAMP 在创建新记录的时候把这个字段设置为给定值,以后修改时刷新它

    1、TIMESTAMP列不为空时,默认值可以为“0000-00-00 00:00:00”,但不能为null。
    2、一个表可以存在多个TIMESTAMP列,但一个表只有一个TIMESTAMP类型的字段可以在默认值或者UPDATE部分用CURRENT_TIMESTAMP,即设置为数据更新而改变为数据库系统当前值。
    3、TIMESTAMP列的默认值是CURRENT_TIMESTAMP常量值。当纪录数据发生变化的时候,TIMESTAMP列会自动将其值设定为CURRENT_TIMESTAMP。
    4、TIMESTAMP列创建后的格式是:

    ALTER TABLE `course`
    ADD COLUMN `birthday`  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
    ALTER TABLE `course`
    ADD COLUMN `birthday`  timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP ;
    
    ALTER TABLE `course`
    ADD COLUMN `birthday`  timestamp NULL AFTER `cname`;

    二、DATETIME
    显示格式:YYYY-MM-DD HH:MM:SS
    时间范围:[ ‘1000-01-01 00:00:00’到’9999-12-31 23:59:59’]

    三、DATE
    显示格式:YYYY-MM-DD
    时间范围:[‘1000-01-01’到’9999-12-31’]

    四、日期格式转换
    1、字符串转日期

    select STR_TO_DATE('2013-01-29 13:49:18', '%Y-%m-%d %H:%i:%s')

    2、日期转字符串

    select DATE_FORMAT('2013-01-29 13:49:18', '%Y-%m-%d %H:%i:%s')

    五、日期的中常用的年月日时分秒星期月份等获取方法

    select TIMESTAMP('2013-01-29 13:50:27');
    select DATE('2013-01-29 13:50:27');
    select YEAR('2013-01-29 13:50:27');
    select MONTH(('2013-01-29 13:50:27');
    select WEEK('2013-01-29 13:50:27');
    select DAY('2013-01-29 13:50:27');
    select TIME('2013-01-29 13:50:27');
    select CURTIME();
    select CURDATE();
    select CURRENT_DATE;
    select CURRENT_TIME;
    select CURRENT_TIMESTAMP;
    select NOW()

    六、日期的运算:

    SELECT DATE_ADD('2013-01-29 13:50:27', INTERVAL 1 DAY);
                    -> '2013-01-30 13:50:27'
    SELECT DATE_ADD('2013-01-29 13:50:27', INTERVAL 1 HOUR);
                    -> '2013-01-29 14:50:27'
    SELECT DATE_ADD('2013-01-29 13:50:27', INTERVAL 1 MONTH);
                   -> '2013-02-28 13:50:27'
    展开全文
  • 使用js转换数据库时间类型

    千次阅读 2016-04-22 20:56:03
    通常查询数据库返回的时间如果不进行处理 返回的格式为 /Date(1459699200000)/ 这时候如果需要用户看懂 就需要进行转换 具体步骤如下: 1 导入打包好的js文件,内容为 /** * 对Date的扩展,将 Date 转化为指定...
  • 时间类型的转换: java.util.Date–>java.sql.Date、Time、Timestamp 把util的Date转换成毫秒值 使用毫秒值创建sql的Date、Time、Timestamp java . util . Date date = new java . util . Date ( ) ;...
  • 查看所涉及到实体时间类型为如图 实体中设置的为date时间戳类型,在页面中需要显示的是"yyyy-MM-dd HH:mm:ss"这种时间格式 解决方案 将实体中的date时间戳改为指定datetime类型时间字段 在SSM进行时间格式转换...
  • 数据库简介及类型

    万次阅读 2018-11-14 16:24:50
    简单的说,数据库(英文Dtabase)就是一存放数据的仓库,这仓库是按照一定的数据结果(数据结构是指数据的组织形式或数据之间的联系)来组织、存储的、我们可以通过数据库提供的多种方法来管理数据库里的数据更...
  • 数据库存取时间类型 精确到毫秒

    千次阅读 2018-10-11 17:40:10
    这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一适合你的列表创建一表格设定内容居中、居左、...
  • 在实体类对应的属性中,加上注解 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") ...即可正常取出时间 "yyyy-MM-dd HH:mm:ss"是显示的时间格式(24小时制) HH 表示24小时,hh表示12小时 ...
  • 今天敲键盘时遇坑 数据库时间显示不全,只...如果数据库时间字段的类型是datetime 跟TIMESTAMP,则mybatis中的jdbctype都是TIMESTAMP MySQL Type Name Return value of GetColumnClassName Returned as Ja...
  • 后面发现是数据库时间类型定义的原因,数据库中定义的是datatime时间戳类型, mysql中Date类型表示的时间为yyyy-MM-dd, 时间戳datatime表示范围是 yyyy-MM-dd HH:mm:ss 可以支持到分秒级别 在使用datetime时...
  • mysql数据库 时间time的类型:datetime 格式:2020-06-29 17:00:28 java对象 public class SDataVersionInfo { private Timestamp updateTime;//修改时间 }
  • sqlite数据库字段类型

    千次阅读 2020-03-25 14:30:39
    数据库字段类型: 字符型字段 topic=models.CharField(max_length=)#需要传入参数,设置字符串的最长长度 email=models.EmailTield()#电子邮箱字段,在CharField基础上,增加了邮箱的正则验证 a=models.SlugField()#...
  • 本篇讲了关于如”MM/dd/yyyy HH:mm”类型字符串日期类型转换的方法,写了一点自己在开发过程中解决问题的方法。 下面上主要代码: 第一种转换方法:public Map, Object> ConvertStrToDate(Map, Object> paramMap) ...
  • 数据库的简介与类型

    万次阅读 多人点赞 2018-03-23 10:04:26
    简单的说,数据库(英文Database)就是一存放数据的仓库,这仓库是按照一定的数据结果(数据结构是指数据的组织形式或数据之间的联系)来组织、存储的、我们可以通过数据库提供的多种方法来管理数据库里的数据更...
  • 各种数据库中的时间日期类型

    万次阅读 2018-04-13 23:48:15
     mysql日期和时间类型:DATE,日期。支持的范围为'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式显示DATE值DATETIME,日期和时间的组合。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL...
  • 数据库建表时时间字段类型设置

    千次阅读 2017-12-15 10:49:48
    数据库建表时时间字段类型设置timestamp,默认值CURRENT_TIMESTAMP
  • mysql中timestamp,datetime,int类型区别   int 1. 占用4字节 2. 建立索引之后,查询速度快 3. 条件范围搜索可以使用使用between 4. 不能使用mysql提供的时间函数 结论:适合需要进行大量时间范围查询的...
  • mysql 数据库时间类型 datetime 转换格式 数据库时间字段datetime可以使用date_format( )函数进行时间的转换。 数据库时间字段类型: 数据库查询结果: 没转换前页面显示的时间数据: 页面显示我是用 ...
  • String 或Clobchar varchar text数据库诸如此类的类型 , 在java中都对应String还是 String 类型,不知你们是否使用Hibernate框架,使用的话可以给String 类型设置最大长度;@Column(length = 1024) private String.....
  • JAVA String时间转化为数据库Date类型

    千次阅读 2017-01-12 20:57:07
    JAVA String时间转化为数据库Date类型
  • * @return java.sql.Timestamp类型日期对象(如果转换失败则返回null) */ public static java.sql.Timestamp strToSqlDate(String strDate, String dateFormat) { SimpleDateFormat sf = new SimpleDateFormat...
  • 文章目录统一javaweb项目和mysql数据库时间UTC时间方法及原理前言UTC时间与 GMT时间时间戳和时区mysql时间字段解读4种日期类型比如datetime和timestamp区别查看和修改时区java里时间类获得系统时间类获得UTC时间...
  • 参照问题1
  • 在java中,对于String 类型的字段,我们在设计数据库的时候,会有两选择,一char,一varchar,那我们应该怎么选择呢? 我们先来看一下char和varchar的区别: char是定长的,varchar是可变的。 举例子:...
  • SpringBoot项目,mysql数据库 数据库的时区 show variables like "%time_zone%"; 阿里云的数据库 根据网上的资料,可以更改数据库的system_time_zone,但是又怕影响其他项目的格式,因此找了其他的解决方案,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,075,033
精华内容 430,013
关键字:

个数据库时间类型