MySQL日期类型的处理总结

一、概述

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

类型大小
(字节)
范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP4

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日期数据类型、时间类型使用总结》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解HTTP协议~~~

详解HTTP协议~~~HTTP 简介HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。。HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;…

Mybatis Plus————代码生成器

代码生成器 MyBatis Plus是MyBatis的扩展框架&#xff0c;而代码生成器是MP的核心功能之一&#xff0c;另外还有 “条件构造器”和“通用CRUD”等功能。 步骤演示 mp的代码生成器有两种方式自动生成代码&#xff0c;一种是通过main方法来执行程序&#xff0c;另一种是通过maven…

Spring MVC 流程图解析

Spring MVC 流程图解析Spring MVC工作流程图图一图二 SpringMVC工作流程描述DispatcherServlet&#xff0c;HandlerMapping&#xff0c;HandlerExecutionChain&#xff0c;HandlerAdapter&#xff0c;HttpMessageConveter&#xff0c;BindingResult&#xff0c;ModelAndView&am…

Java并发编程实战————可重入内置锁

引言 在《Java Concurrency in Practice》的加锁机制一节中作者提到&#xff1a; Java提供一种内置的锁机制来支持原子性&#xff1a;同步代码块。“重入”意味着获取锁的操作的粒度是“线程”&#xff0c;而不是调用。当某个线程请求一个由其他线程持有的锁时&#xff0c;发出…

java的守护进程与非守护进程

java的守护进程与非守护进程 最近重新研究Java基础知识&#xff0c;发现以前太多知识知识略略带过了&#xff0c;比较说Java的线程机制&#xff0c;在Java中有两类线程&#xff1a; User Thread(用户线程)、Daemon Thread(守护线程) &#xff0c;&#xff08;PS:以前忽略了&a…

双剑合璧————Spring Boot + Mybatis Plus

引言 最近在学习Mybatis Plus的使用&#xff0c;希望通过spring boot快速将mybatis plus整合进来。 对于springboot项目&#xff0c;mybatis plus团队也有自己的启动器 &#xff1a;mybatis-plus-boot-starter。这个依赖内部已经整合了mybatis-spring&#xff0c;也包括非快速…

Git初学札记(一)————Git简介与安装

前言 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。&#xff08;在这里再一次致敬Linus大神&#xff09;特点 分布式相比于集中式的最…

Git初学札记(二)————EGit导入远程Git仓库项目(Clone操作)

引言 我们在实际开发项目的时候&#xff0c;难免要使用像Eclipse或者IDEA这样的继承开发工具&#xff0c;除了部分“牙牙学语”的程序员需要手动输入javac去编译程序以外&#xff0c;在实际开发中手动编译并运行项目的“猿族”应该是已经绝种了。 我个人认为&#xff0c;使用gi…

Git初学札记(三)————创建Git版本库

引言 版本库即所谓的Git仓库&#xff0c;英文名称是Repository&#xff0c;可以简单理解为一个目录&#xff08;.git folder&#xff09;&#xff0c;这个目录可以记录并保存直接父级及其子目录下的全部文本文件的修改操作&#xff0c;谓之“版本控制”&#xff01; 手动建库 不…

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

目录 引言 Git命令行的远程Push EGit Push操作中的冲突问题 同步 工作区与本地库同步 工作区与远程库同步 图标 重点 引言 在团队开发当中&#xff0c;Git Push是多人协作环节中的最重要的一环可能没有之一。同SVN一样&#xff0c;push操作可以看做是对远端程序的提交…

Git初学札记(五)————Branch分支管理

引言 正如之前的博客中提到的&#xff0c;Git区别于Svn的一个最明显的功能就是分支管理功能。 那么什么是分支&#xff1f;分支又能为我们的开发带来什么翻天覆地的变化呢&#xff1f;&#xff08;为了使博客的内容更具权威性和专业性&#xff0c;以下部分内容摘自官方文档《Gi…

Git初学札记(六)————在远程新建本地Branch与在本地新建远程Branch

引言 本篇博客介绍将现有的本地分支以新的分支形式推送到远程库中&#xff0c;和以新的分支的形式从远程库中拉取一个分支。这两个功能都是比较简单的操作&#xff0c;但是在实际开发中&#xff0c;可能会在开发初期有所触及。比如我们希望将远程的dev分支拉取到本地来进行开发…

Git初学札记(七)————合并分支(merge)

目录 引言 开始Merge 1、History视图 2、Team菜单 3、Git Repositories视图 巧用Git Staging视图 放弃Merging 可能的Merge结果 引言 Git鼓励开发者使用分支来进行程序的开发。但是最终只会有一个版本发行出去&#xff0c;因此&#xff0c;我们需要将开发好的分支merg…

公钥,私钥和数字签名这样理解轻松入门!

公钥&#xff0c;私钥和数字签名这样理解轻松入门&#xff01;参考博文&#xff1a;https://blog.csdn.net/21aspnet/article/details/7249401 &#xff08;公钥和私钥是成对出现的&#xff0c;可以把他们看成锁头和钥匙的关系&#xff0c;公钥为锁头&#xff0c;私钥是钥匙&am…

Spring Boot + JSP

目录 引言 Maven依赖 JSP页面 application.properties配置 controller 结果展示 引言 在尝试使用shiro的时候需要页面登录的加持&#xff0c;但是长期的前后端分离工作&#xff0c;导致页面的知识几乎忘光。突然想通过jsp这种简单的形式来学习其他的技术&#xff0c;作为…

https和http的区别

https和http的区别一、基本概念&#xff08;http服务器-->本地浏览器&#xff0c;正确快速传输&#xff1b;https安全套接字层&#xff0c;http的安全版本&#xff0c; httpssl层&#xff0c;建立一个信息安全的通道&#xff0c;保证数据传输的安全&#xff0c;确认网站的…

Markdown简明使用

#Markdown使用技巧 ##代码背景 可以使用反引号&#xff0c;来将特殊文字括起来&#xff0c;这样Markdown会自动为引号中的内容加入背景。 形如&#xff1a;内容 例如&#xff1a;Java project > team > share project ##图片上传 图片无法像正常的文本编辑器那样直接粘贴…

Spring Boot + Mybatis 快速整合

引言 最近在工作结束后抽时间学习了一下mybatis的知识&#xff0c;因为之前有学习过&#xff0c;但是经久不用&#xff0c;也未曾踏实地整理&#xff0c;因此有所淡忘。 super meeting会议管理系统是我厂最近开发的一套会议预约平台。持久层框架经讨论&#xff0c;选为灵活优…

SQL关联查询————LEFT JOIN关键字的使用

引言 关联查询一直是非常重要的SQL使用技巧。 在一次查询操作中&#xff0c;使用mybatis进行条件查询&#xff0c;在没有使用 LEFT JOIN 关键字的情况下是这样写的&#xff1a; <!-- 查找成员 --><select id"selectUsers" resultMap"selectUsers_Res…

Java知识点全面汇总

&#xfeff;&#xfeff; 相关概念 面向对象的三个特征 封装&#xff0c;继承&#xff0c;多态&#xff0c;这个应该是人人皆知&#xff0c;有时候也会加上抽象。 多态的好处 允许不同类对象对同一消息做出响应&#xff0c;即同一消息可以根据发送对象的不同而采用多种不…