MySql 时间类型 & JDBC时间类型

MySql时间类型:DATETIME & TIMESTAMP

  • 长度

    • DATETIME类型包含DATE和TIME,范围1000-01-01 00:00:00 ~ 9999-12-31 23:59:59。DATETIME还能包含毫秒,例如2018-03-11 14::13:22.999
    • TIMESTAMP也能存储日期和时间,但是范围只有1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC
  • 时区
    • DATETIME存储的时间不包含时区
    • TIMESTAMP存储的UTC时间

      例如:

      1. create table

        CREATE TABLE timestamp_n_datetime (
        id INT AUTO_INCREMENT PRIMARY KEY,
        ts TIMESTAMP,
        dt DATETIME
        );
      2. insert now(当前时区为+08)
        insert into timestamp_n_datetime(ts,dt) values (now(), now());
      3. select
        MariaDB [test]> select * from timestamp_n_datetime;
        +----+---------------------+---------------------+
        | id | ts                  | dt                  |
        +----+---------------------+---------------------+
        |  1 | 2018-03-11 14:35:01 | 2018-03-11 14:35:01 |
        +----+---------------------+---------------------+
        1 row in set (0.00 sec)
      4. 修改时区
        MariaDB [test]> set time_zone = ‘+00:00‘;
        Query OK, 0 rows affected (0.02 sec)
      5. 再次查询
        MariaDB [test]> select * from timestamp_n_datetime
        -> ;
        +----+---------------------+---------------------+
        | id | ts                  | dt                  |
        +----+---------------------+---------------------+
        |  1 | 2018-03-11 06:35:01 | 2018-03-11 14:35:01 |
        +----+---------------------+---------------------+
        1 row in set (0.00 sec)

        TIMESTAMP存储的时间调整到了新时区,而DATETIME存储的时间不变。刚接触java的时候写代码的就出现过时区问题,mybatis mysql,表字段类型为DATETIME,java类型为java.util.Date。通过查看java connector源码com.mysql.cj.mysqla.MysqlaSession.java的configureTimezone方法,

        this.getServerVariable("system_time_zone")

        调试这里发现从系统里面读出来的时区设置是CST。于是去查找数据库服务器的原因

        MariaDB [(none)]> show variables like ‘%time_zone%‘;
        +------------------+--------+
        | Variable_name    | Value  |
        +------------------+--------+
        | system_time_zone | CST    |
        | time_zone        | SYSTEM |
        +------------------+--------+
        2 rows in set (0.01 sec)

        解决方法:

        • 修改配置文件 /etc/my.cnf.d/server.cnf (centos 7),需要重启mysql

          # this is only for the mysqld standalone daemon
          [mysqld]
          default-time-zone=‘+08:00‘ # 将这行加到mysqld节点下
        • 修改数据库服务变量(未验证,如果不方便修改配置文件或重启数据库。重启数据库之后失效??)
          set time_zone=‘+08:00‘;
          set global time_zone=‘+08:00‘;
          flush privileges;

        如果是直接使用jdbc而不是mybatis,则通过

        java.util.Date now = new java.util.Date();
        java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(now.getTime());
        PreparedStatement.setTimestamp(1, sqlTimestamp, Calendar.getInstance(Locale.CHINA)); 

        即指定第三个参数。如果没有指定第三个参数,则又使用了CST时间(setTimestamp源码中)

JDBC表示时间的类型

这一节的资料有点老(https://www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/guide/jdbc/getstart/mapping.doc.html)

这三种类型都继承自java.util.Date,因为java.util.Date没法匹配三种JDBC时间类型。

  • DATE表示只包含了年月日的时间类型 java.sql.Date for SQL DATE(这里的SQL说的是SQL-92标准)。 父类的hour, minute, second, millisecond字段被设置为0。
  • TIME表示只包含了时分秒的时间类型 java.sql.Time for SQL TIME information. 父类的year, month, day字段被设置为1970, 1月, 1号. 这个时间是java里面的“零纪元”
  • TIMESTAMP包含了DATE+TIME再加上一个纳秒(nanosecond)字段 java.sql.Timestamp for SQL TIMESTAMP information. 这个类型为java.util.Date扩展了额外的nanosecond字段。

其他命令

get current time_zone

SELECT @@global.time_zone, @@session.time_zone;

如果查询结果是SYSTEM,表示mysql服务器使用了系统时区 date -R命令能查看系统时区。

原文地址:https://www.cnblogs.com/gdme1320/p/9061283.html

时间: 2024-10-13 11:31:05

MySql 时间类型 & JDBC时间类型的相关文章

MySQL中日期和时间类型

1 日期类型 MySql中关于日期的类型有Date/Datetime/Timestamp三种类型. 日期赋值时,允许"不严格"语法:任何标点符都可以用做日期部分或时间部分之间的间割符.例如,'98-12-31 11:30:45'.'98.12.31 11+30+45'.'98/12/31 11*30*45'和'[email protected]@31 11^30^45'是等价的,对于不合法的将会转换为:0000-00-00 00:00:00 1.1 Date格式 此类型的字段,存储数据

MySQL数据类型--------日期与时间类型实战

1. 背景 * MySQL支持多种表示日期和时间的数据类型,如YEAR.TIME.DATETIME.TIMESTAMP等等-- * MySQL 5.6.4版本开始支持微秒(支持类型:TIMTE.DATETIME.TIMESTAMP, 微秒长度最大为6) 2. 日期与时间类型所属空间与表示范围 类型 5.6.4版本之前 占用字节 5.6.4版本之后 (包含5.6.3版本) 占用字节 表示范围 DATETIME 8 6+(微秒长度-1 )/2 1000-01-01 00:00:00 ~ 9999-1

MySQL日期数据类型、时间类型使用总结

1.MySQL的五种日期和时间类型 MySQl中有多种表示日期和时间的数据类型.其中YEAR表示年份,DATE表示日期,TIME表示时间,DATETIME和TIMESTAMP表示日期和实践.它们的对比如下: TEAR ,字节数为1,取值范围为“1901——2155” DATE,字节数为4,取值范围为“1000-01-01——9999-12-31” TIME,字节数为3,取值范围为“-838:59:59——838:59:59” DATETIME,字节数为8,取值范围为“1000-01-01 00:

MySQL日期数据类型和时间类型使用总结

转自: http://blog.chinaunix.net/space.php?uid=11327712&do=blog&id=32416 MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型 存储空间 日期格式 日期范围 ------------ --------- --------------------- ----------------------------------------- datetime 8 bytes YYYY-MM-DD HH:MM:SS 1

mysql那些事(2)时间类型数据如何存储

几乎每次数据库建模的时候,都会遇到时间类型数据存储的问题. mysql存储时间通常选择这四种类型:datetime.timestamp.int和bigint四种方式,到底使用什么类型,需要看具体的业务. 我们分别对这四种类型进行讨论. 1.datetime 这个类型可以存储8字节,表示从1000到9999年之间的数据.这个类型可以为空值,也可以自定义值,默认的初始值是"0000-00-00 00:00:00". 这种类型存储的存储的优点是数据可读性强,不需要函数做转换. 2.times

MySQL 中的日期时间类型

日期时间类型中包含以下几种数据类型: DATE TIME DATETIME TIMESTAMP YEAR 各类型都有具体的取值范围,超出或非法的其他值时,MySQL 会回退到 0.TIMESTAMP 类型是个例外,给它设置一个超出范围的值时,将保存上该类型允许的最大值. MySQL 按标准格式 YYYY-MM-DD hh:mm:ss[.fraction] 输出日期时间,但设置或进行日期时间相关的比较时却支持灵活的多种格式,会自动解析.具体支持的输入格式可参见 Section 9.1.3, "Da

MySQL 数据类型:数值、日期和时间、字符串等类型详解

MySQL 数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 数值类型 MySQL支持所有标准SQL数值数据类型. 这些类型包括严格数值数据类型(INTEGER.SMALLINT.DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT.REAL和DOUBLE PRECISION). 关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词. BIT数据类型保存位字

实现传入两个字符串类型的时间的相减

主要代码: 1 import java.text.DateFormat; 2 import java.text.SimpleDateFormat; 3 import java.util.Date; 4 5 6 public class TestDateTimeAdd 7 { 8 9 public static void main(String[] args) 10 { 11 try 12 { 13 subDateTime("2015-12-09 15:55:30", "201

long类型的时间转为n秒前n分钟前n小时前或者日期

1 package com.tai.use; 2 3 import java.text.DateFormat; 4 import java.text.SimpleDateFormat; 5 import java.util.Calendar; 6 import java.util.Date; 7 8 public class GuiYI 9 { 10 /** 11 * GuiYI 诡异的需求 12 * 转为 n秒前 n分钟前 n小时前 日期 13 * @param time 14 * @para