一、概述

MySQL中的日期类型包括以下5种:

类型 大小
(字节)
范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4

1970-01-01 00:00:00/2038

结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07

YYYY-MM-DD HH:MM:SS 混合日期和时间值,时间戳

二、DATE

从取值范围来看DATE类型的mysql数据并不受格林尼治时间的限制。

1、使用场景

可以看到DATE类型的数据格式为:YYYY-MM-DD,对于只限制到日期的数据项,我们可以使用此种类型存储,如生日、节假日等。

2、Java存储方式

Java中对于date类型的存储可以使用java.sql.date直接存入。

    public int test() {String sql = "INSERT INTO user2(user_name,birthday) VALUES(?,?)";Object[] args = { "mht",java.sql.Date.valueOf("1992-11-20") };return jdbc.update(sql,args);}

执行结果:

这是使用指定日期格式的字符串插入date类型数据的情况,对于那些并不是日期字符串的日期、毫秒值等,可以先通过DateFormat抽象类将其转化为“yyyy-MM-dd”后再传入静态方法Date.valueOf(String dateStr)来实现。

3.Java查询方式

DATE类型的mysql数据查询到Java程序中,我们如何接收和处理。

首先,定义接收的实体类:

执行查询:

    public User test() {String sql = "select * from user2";List<User> list = jdbc.query(sql, new BeanPropertyRowMapper<>(User.class));User user = list.get(0);return user;}

查询结果:

说明:这里使用了一个静态内部类来接收从数据库中查询的user对象,但是这和普通的实体类并没有什么两样。此处没有截取get、set方法,但是对于使用框架来查询mapper的情况,get、set应该是必须的。

这里可能会有疑问,从数据库中使用的date类型,在Java中可以用util.Date来接收吗?

答案是可以的,当然也可以使用sql.Date,这并不会影响最终我们取得的数据,因为:

public class Date extends java.util.Date {

如果我们将date类型(无论是sqlDate还是utilDate)直接返回给页面,那么他们拿到的都是一个毫秒值(时分秒部分全为0),所以无论如何都需要在页面通过js来实现日期的格式化,当然这不在我们的讨论范畴之内。

总之,在Java中接收DATE日期,直接使用java.util.Date即可,也方便我们做其他转化工作。

三、TIME

MySQL中的TIME时间类型,可以用于存储时长或时间点。

1、Java存储

    public int test() {String sql = "INSERT INTO user2(user_name,time_on_foot) VALUES(?,?)";Object[] args = { "mht",java.sql.Time.valueOf("0:5:30") };return jdbc.update(sql, args);}

存储结果:

2、Java查询

实体类:

对于TIME类型的mysql数据,Java中有对应的java.sql.Time来接收其值,而且,返回页面的数据也会正常显示数据库中存储的样子而不会“变形”。

    public User test() {String sql = "select * from user2";List<User> list = jdbc.query(sql, new BeanPropertyRowMapper<>(User.class));User user = list.get(0);return user;}

查询结果:

但是用java.util.Date来接收TIME类型的MySQL数据就会出现问题,所以对于TIME类型的数据,貌似只能用java.sql.Time类来接收数据。在实际开发中注意体会和总结。

四、DATETIME和TIMESTAMP

终于到了重头戏部分!

DATETIME代表的语言含义是“日期时间”;而TIMESTAMP则表示“(人能看懂的)时间戳”。

两种类型数据的格式都是“YYYY-MM-DD HH:MM:SS”。那在实际应用中我们的数据到底应该使用前者还是后者呢?

1、两者的区别

a)、两者的范围不同。

b)、两者的存储大小不同。TIMESTAMP存储空间是DATETIME的一半!

c)、虽然管理工具中并未显示,但实际上TIMESTAMP可以精确到毫秒。

d)、TIMESTAMP有个特性:在insert、update数据时,TIMESTAMP列可以自动以当前时间(CURRENT_TIMESTAMP)填充/更新,MySQL引擎可以自动为更新的数据维护这个值。我们可以通过勾选“根据当前时间更新”复选框来调整MySQL数据库对该字段的维护操作。如果有多个TIMESTAMP列,并且都勾选了此项,那么MySQL会对这些列都进行维护操作。

e)、TIMESTAMP会受到时区timezone的影响以及MySQL和SQL mode的影响。

2、TIMESTAMP设置默认值的方式

sql方式:

ALTER TABLE user2 MODIFY upd_time TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP

管理工具方式:

新增记录:

INSERT INTO user2(user_name) VALUES("MHT")

结果展示:

2.Java存储

先看一下db结构:

对于TIMESTAMP类型的数据,如果设置了默认值,且更新时数据库会自动维护,那么在Java 中就不需要对其进行处理。如果需要Java进行插入,我们也可以通过如下方式来添加时间戳数据:

    public int test() {String sql = "INSERT INTO user2(user_name,upd_time2) VALUES(?,?)";Object[] args = { "test1", new java.sql.Timestamp(System.currentTimeMillis())};return jdbc.update(sql,args);}

我们通过java.sql.Timestamp对象来存储不需要MySQL为我们维护的TIMESTAMP数据即可。

还以上表说话。

对于DATETIME类型的数据,create_time。实际上我们可以将这个字段设计为一个不会随系统时间改变的TIMESTAMP。即只有insert的时候添加默认值,update时不会更新此值。

如果确定是要用datetime来表示该字段,那么,我们需要在Java中通过java.util.Date来存储该值。因为java.util.Dated 默认包含时分秒数据,可以完美对应MySQL中DATETIME类型的数据。

        String sql = "UPDATE user2 SET create_time = ? WHERE user_name = 'test1'";Object[] args = {new java.util.Date(System.currentTimeMillis())};jdbc.update(sql,args);

执行结果为:

3、Java查询

表中存在三个字段create_time、upd_time、upd_time2,第一个是DATETIME类型,后面两个是TIMESTAMP类型数据。

我们的User对象定义三个字段的类型如下:

执行查询:

    public User test() {String sql = "select * from user2";List<User> list = jdbc.query(sql, new BeanPropertyRowMapper<>(User.class));User user = list.get(0);return user;}

输出结果:

可以看到MySQL中TIMESTAMP类型的数据无论用java.sql.Timestamp还是java.util.Date接收传到页面都是一个只精确到秒的毫秒值的形式。所以这两种方式并没有太大的区别。

DATETIME数据由于Java中只有java.util.Date可对应其类型,因此我们用其接收数据,也完全没问题。为了方便记忆,我们可以在查询DATETIME和TIMESTAMP两种类型数据的时候都通过java.util.Date来接收即可。

五、常用的MySQL日期函数

SELECT NOW(),CURRENT_DATE(),CURRENT_TIME(),CURRENT_TIMESTAMP(),LOCALTIMESTAMP(),LOCALTIME()

输出结果:

-----------------------------------------------------我是分割线--------------------------------------------------------

综上,就是对MySQL日期类型的处理总结,如有疑问,欢迎文末留言。

参考文章:《MySQL日期数据类型、时间类型使用总结》

MySQL日期类型的处理总结相关推荐

  1. mysql插入时间字段为空值_php – 如何在mysql日期类型字段中插入一个空值?

    如何在 mysql日期类型字段(NULL = yes)中插入NULL或空值. 如果我尝试插入一个空值,它会插入0000-00-00,但是我想保持为空或为空. 感谢帮助. UPDATE 请看我已经将默认 ...

  2. MySQL 日期类型及默认设置

    MySQL 日期类型及默认设置 之前在用 MySQL 新建 table,创建日期类型列时遇到了一些问题,现在整理下来以供参考. MySQL 的日期类型如何设置当前时间为其默认值? **答:**请使用 ...

  3. MySQL 日期类型小数秒的处理

    一. MySQL 日期类型对小数秒的支持 注:本文所使用MySQL版本为 5.7 版本. 官方文档:https://dev.mysql.com/doc/refman/5.7/en/fractional ...

  4. mysql毫秒值转成日期,MySQL日期类型和毫秒值相互转换

    有时需要将日期类型值转换成毫秒值,有时也要将毫秒值转换成日期,为了更方便,满足查询的需要. 现在,新建一张数据库表t_stu_info,并向表里插入数据 use test; show tables; ...

  5. mysql 日期类型比价_MySQL 日期时间类型怎么选?

    构建数据库写程序避免不了使用日期和时间,对于数据库来说,有多种日期时间字段可供选择,如 timestamp 和 datetime 以及使用 int 来存储 unix timestamp. 不仅新手,包 ...

  6. MySQL日期类型及默认设置

    今天建表时,执行sql文件,报了一个类型为日期,但是默认值错误的提示,特意将date类型默认值总结了一下,如下: 目前只能使用timestamp 类型,且默认值设为 now() 或 current_t ...

  7. MyBatis处理MySQL日期类型

    1.1 简述 在日常的开发中,难免会遇到时间的比较或者区间等问题,该博文主要是正对Mybatis与MySQL数据库相结合的日期类型讲解. 1.2 类型 下面给大家列举了三种表示时间的类型: 1.2.1 ...

  8. mysql 日期类型的取值范围

    文章目录 前言 一.YEAR 二.DATE 三.TIME 四.YEAR 五.TIMESTAMP 前言 MySQL 日期和时间取值范围,避免在从其他数据库转向MYSQL数据库踩坑 提示:以下是本篇文章正 ...

  9. iBATIS date MySQL_LocalDateTime与mysql日期类型的交互(基于mybatis)

    众所周知,在实体Entity里面,可以使用Java.sql.Date.java.sql.Timestamp.java.util.Date来映射到数据库的date.timestamp.datetime等 ...

最新文章

  1. 数据通信技术(七:RIP路由水平分割配置)
  2. 电脑显示服务器地址无法ping通,网关无法Ping通故障及解决方法
  3. 各种树:trie树、B树、B-树、B+树、B*树
  4. 震惊!这些喵星人竟然被集体包养!
  5. SQL中的撤销索引、表以及数据库
  6. 配置phython环境
  7. 【Error】IDEA报错:org.jetbrains.jps.builders.java.dependencyView.TypeRepr$PrimitiveType cannot be cast t
  8. pandas keyerror: 标签_Hinton新作!越大的自监督模型,半监督学习需要的标签越少...
  9. OPPO Reno配置曝光 骁龙855+10倍混合光学变焦
  10. UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
  11. golang mysql scan_golang 实现 mysql 数据库备份
  12. CoreJava Reading Note(3:Fundamental structure)
  13. 搜索引擎-Lucene
  14. python简明教程中文pdf-简明Python教程-中文版.pdf
  15. 酒店服务机器人或被用于长期偷窥旅客
  16. 华人运通高合HiPhiX维修手册电路图技术培训用户手册资料
  17. 代数余子式与伴随矩阵
  18. 数据库课程大作业——数据分析与数据管理系统实践
  19. CampusBulider(模模搭)学习笔记6:室内搭建
  20. Only one expression can be specified in the select list when the subquery is not introduced with EXI

热门文章

  1. SpringBoot 如何统一后端返回格式?老鸟们都是这样玩的!
  2. Java中这7个方法,一不小心就用错了!
  3. 带你玩转七牛云存储——高级篇
  4. servlet 和 struts2 同时使用 以及 使用struts2标签库时报错
  5. mysql+e+文件+xls_TP5+PHPexcel导入xls,xlsx文件读取数据
  6. 前端控件JQuery Datatables使用——常用功能初始化
  7. git@github.com:Permission denied(publickey).fatal: Could not read form remote repository错误
  8. 同时运行两个PHP吗,PHP-避免由两个工作人员同时运行后台作业
  9. linux禁止客户端上传文件_Linux 几种上传文件到linux服务的方法
  10. 矩阵论思维导图_《实变函数论》 江泽坚 3rd 思维导图与笔记整理