在使用new Date()生成时间戳时,发现数据库中 的时间总是多出一秒钟。

项目汇报的时候,进一步研究问题

insert into t_tax_file(task_id, task_no, business_type, file_name, file_url, creator_id, created_time, modifier_id,
                       modified_time)
    value (10, 'taskNo测试', 1, '文件名称', '文件地址', 1, '2024-10-21 10:25:21.889', 1, '2024-10-21 10:25:21.449');
-- 方法二:使用 DATE_FORMAT 和 CONCAT 函数
SELECT  created_time,
       modified_time
FROM t_tax_file where task_no='taskNo测试';


差个一秒钟

image-20241021113445157

表结构

create table t_tax_file
(
    id            bigint unsigned auto_increment comment '主键'
        primary key,
    task_id       bigint                                    null comment '任务id',
    task_no       varchar(64)                               null comment '任务编号',
    business_type tinyint(1)                                null comment '业务类型',
    file_name     varchar(256)                              null comment '文件名称',
    file_url      varchar(500)                              null comment '文件url',
    creator_id    bigint unsigned default '0'               null comment '创建者id.对应员工id.',
    created_time  timestamp       default CURRENT_TIMESTAMP null comment '创建时间',
    modifier_id   bigint unsigned default '0'               null comment '修改id.对应员工id.',
    modified_time timestamp       default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '最后修改时间'
)
    comment '纳税申报-附件表';

mysql 5.6 之后的版本,timestamp 支持了微秒数。timestamp 和datetime区别

TIMESTAMPdatetime
两者的存储方式不一样对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。而对于DATETIME,不做任何改变,基本上是原样输入和输出。
存储范围timestamp,使用4个字节,所能存储的时间范围为:‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’。datetime使用8个字节,所能存储的时间范围为:‘1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’。
注意点MySQL中的TIMESTAMP数据类型用于存储日期和时间,支持小数秒精度,可以精确到微秒(即小数点后6位)。如果你在插入或更新TIMESTAMP列时没有指定小数部分,则默认精度是秒级,也就是不包含小数部分。

总结:TIMESTAMP和DATETIME除了存储范围和存储方式不一样,没有太大区别。当然,对于跨时区的业务,TIMESTAMP更为合适。

当指定了小数位数之后。

image-20241021114027514

数据就完全正确了

image-20241021114014502

测试其他数据类型

-- 创建表
-- 测试datetime的精度
CREATE TABLE test(
    -- 默认精度为0
    -- Maximum is 6.
                     datetime1 DATETIME,
                     datetime2 DATETIME(3),
                     datetime3 DATETIME(5)
);
INSERT INTO test VALUES("2020-11-22 12:01:01.59999", "2020-11-22 12:01:01.59999", "2020-11-22 12:01:01.59999");
INSERT INTO test VALUES("2020-11-22 12:01:01.5", "2020-11-22 12:01:01.599", "2020-11-22 12:01:01.59999");
INSERT INTO test VALUES("2020-11-22 12:01:01.4", "2020-11-22 12:01:01.594", "2020-11-22 12:01:01.59994");
INSERT INTO test VALUES("2020-11-22 12:01:01.5", "2020-11-22 12:01:01.5995", "2020-11-22 12:01:01.599995");
INSERT INTO test VALUES("2020-11-22 12:01:01.5", "2020-11-22 12:01:01.5994", "2020-11-22 12:01:01.599994");

image-20241021135238655

-- 创建表
-- 测试timestamp的精度
CREATE TABLE test11(
    -- 默认精度为0
    -- Maximum is 6.
    datetime1 TIMESTAMP,
    datetime2 TIMESTAMP(3),
    datetime3 TIMESTAMP(5)
);
INSERT INTO test11 VALUES("2020-11-22 12:01:01.59999", "2020-11-22 12:01:01.59999", "2020-11-22 12:01:01.59999");
INSERT INTO test11 VALUES("2020-11-22 12:01:01.5", "2020-11-22 12:01:01.599", "2020-11-22 12:01:01.59999");
INSERT INTO test11 VALUES("2020-11-22 12:01:01.4", "2020-11-22 12:01:01.594", "2020-11-22 12:01:01.59994");
INSERT INTO test11 VALUES("2020-11-22 12:01:01.5", "2020-11-22 12:01:01.5995", "2020-11-22 12:01:01.599995");
INSERT INTO test11 VALUES("2020-11-22 12:01:01.5", "2020-11-22 12:01:01.5994", "2020-11-22 12:01:01.599994");

image-20241021135430709

总结

类型所占字节格式范围
TIMESTAMP4字节YYYY-MM-DD HH:MM:SS1970-01-01 00:00:01utc到2038-01-19 03:14:07utc
DATETIME5字节YYYY-MM-DD HH:MM:SS1000-01-01 00:00:00到9999-12-31 23:59:59
DATE3字节YYYY-MM-DD1000-01-01到9999-12-31
TIME3字节HH:MM:SS-838:59:59到838:59:59
YEAR1字节YYYY1901到2155

注:MySQL 5.6.4 之前,占 8 个字节 ,之后版本,占 5 个字节。

其他特性

  1. TIMESTAMP是以utc格式存储,会自动检索当前时区对时间进行转换,而DATETIME不会。
  2. 存入null时,TIMESTAMP会自动存储当前时间,而DATETIME存储null值。
  3. 时间计算:

DATETIME翻译为汉语即"时间戳",它是当前时间到 Unix元年(1970 年 1 月 1 日 0 时 0 分 0 秒)的秒数。对于某些时间的计算,如果是以 DATETIME 的形式会比较困难,假如我是 1994-1-20 06:06:06 出生,现在的时间是 2016-10-1 20:04:50 ,那么要计算我活了多少秒钟, DATETIME还需要函数进行转换,但是 TIMESTAMP 直接相减就行。

场景选择

1.需要跨时区计算时间用 或者 需要自动更新时间的TIMESTAMP

计算一架从北京飞往纽约的飞机的飞行时间。这个场景中,如果使用 TIMESTAMP 来存时间,起飞和降落时间的值,都会被转换成 UTC 时间,所以它们直接相减即可获得结果。但如果使用 DATATIME 格式存时间,还需要进行转换,才可以完成,容易出错。

2.记录创建修改时间 或者 时间范围大于2038 用DATETIME

DATATIME作为记录时间,现在都已经2022年了,很快就到2038年啦,使用DATATIME不需要担心超过范围。

当然在两者都满足使用的情况下,所占字节越小越好,TIMESTAMP比DATATIME好。

bigint使用(8个字节)

还有一种情况,即不用TIMESTAMP也不用DATATIME,而是用BIGINT。存储自纪元以来的毫秒数(如果使用的是 Java,则用 System.currentTimeMillis() 获取当前时间)

这样有几个优点:

  1. 可以在迁移数据库时避免因为数据类型差异。比如MySQL的DATETIME类型和Oracle的DATETIME类型之间可能存在差异,timestamp类型的精度可能也存在差异,MySQL的timestamp精度不是一开始就支持毫秒精度的。
  2. 没有时区问题。无论是哪个时区,因为开始计算的时间不同,无论当前时间如何,跨度是一致的。也没有timestamp和datatime的范围问题。是对timestamp的补充。
  3. InnoDB存储引擎下,通过时间范围查找,性能bigint > datetime > timestamp,通过时间排序,性能bigint > timestamp > datetime。综合来讲,bigint性能最好。

思考:

当发现问题,要把原因搞懂,然后进一步挖掘可以用的东西。不能浮于表面。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CCF-BDCI大数据与计算智能大赛TOP4-京东生鲜

2023 CCF 大数据与计算智能大赛《线上线下全场景生鲜超市库存履约一体化决策》top4南山论剑 摘要1 数据预处理1.1 数据整合1.2 数据划分 2 特征工程2.1 静态特征2.2 动态特征 3 方案设计3.1 数据构造3.2 模型训练3.3 模型融合3.4库存分配3.5 方案对比 链接: CCFBDCI-线上线下全…

对BSV区块链下一代节点Teranode的答疑解惑(上篇)

​​发表时间:2024年8月7日 2024年初BSV区块链研发团队揭晓了即将到来的Teranode更新的突破性特性,这些特性将显著提升网络的效率和处理速度,使BSV区块链能够达到百万级TPS。 Teranode的项目主管Siggi Oskarsson强调:“当你阅读这…

uniapp项目结构基本了解

基本结构的解释 App.vue:应用的根组件,定义全局布局和逻辑。pages/:存放各个页面的 .vue 文件,定义应用的具体页面和功能模块。main.js:应用入口文件,初始化应用,挂载 App.vue。manifest.json&…

[Linux进程概念]命令行参数|环境变量

目录 一、命令行参数 1.什么是命令行参数 2.为什么要有命令行参数 (1)书写的代码段 (2)实际的代码段 3.Linux中的命令行参数 二、环境变量 1.什么是环境变量? 2.获取环境变量 (1)指令…

基于Multisim电子配料秤电路设计(含仿真和报告)

【全套资料.zip】电子配料秤电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 电子配料秤仿真功能: 准确测量物体重量,精确度0.1Kg使用两位数码管显示重量信息 使用拨码…

深度学习 基本函数01

np.dot 是 NumPy 库中的一个函数,用于计算两个数组的点积(也称为内积或数量积)。点积是两个向量的对应元素乘积之和。 np.random.normal 是 NumPy 库中的一个函数,用于生成符合正态分布(也称为高斯分布)的…

jmeter用csv data set config做参数化1

在jmeter中,csv data set config的作用非常强大,用它来做批量测试和参数化非常好用。 csv data set config的常用配置项如下: Variable Names处,写上源文件中的参数名,用于后续接口发送请求时引用 Ignore first line…

Mybatis多对一查询的配置及两种方法的使用示例对比以及Mybatis一对多查询两种方法使用示例及对比

一、Mybatis多对一查询的配置及两种方法的使用示例对比 为了试验Mybatis多对一的查询,我们先在数据库中建两个表,一个城市表,一个市区表,一个城市有多个区是一个一对多的关系;多个区对应一个城市是一个多对一的关系。建…

spring源码拓展点3之addBeanPostProcesser

概述 在refresh方法中的prepareBeanFactory方法中,有一个拓展点:addBeanPostProcessor。即通过注入Aware对象从而将容器中的某些值设置到某个bean中。 beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));aware接口调用 …

ThinkPad T480拆机屏幕改装:便携式显示器DIY指南

ThinkPad T480拆机屏幕改装:便携式显示器DIY指南 本文记录了将旧笔记本电脑 T480 拆机屏幕改装为便携式显示器的全过程。作者在决定升级设备后,选择通过 DIY 方式利用原有的屏幕资源。文章详细介绍了屏幕驱动板的安装、螺丝孔的剪裁、排线连接及固定的步…

[DB] NSM

Database Workloads(数据库工作负载) 数据库工作负载指的是数据库在执行不同类型任务时所需的资源和计算方式,主要包括以下几种类型: 1. On-Line Transaction Processing (OLTP) 中文:联机事务处理解释:…

hive初体验

1.首先,确保启动了Metastore服务。 runjar就是metastore进程 2.进入hive客户端: 命令:hive 3.操作:没有指定数据库时默认在default 一:创建表:CREATE TABLE test(id INT, name STRING, gender STRING); 完成,show tables看一下 也可以通过hdfs文件系统查看,默认路径…

go多线程

1.仅加go 在一个golang编写的程序,主函数运行完毕后,程序就结束了 package mainimport ("fmt""time" )func main() {// 如果这样写go 要加在上面的函数,因为如果只单独加在下面的函数或者都加上,程序就会直接…

Leetcode 柱状图中最大的矩形

h 是右边界&#xff0c;连续多个高度递增的柱子&#xff0c;如果遇到下一个 h < 栈顶元素(是最大的元素&#xff0c;单调递增栈)&#xff0c;那么会不断出栈来更新计算最大面积。 并非是一次性计算出最大面积的&#xff0c;很重要的一点是while (!stack.isEmpty()这一部分的…

Vivado自定义IP修改顶层后Port and Interface不更新解决方案

问题描述 在整个项目工程中&#xff0c;对自定义IP进行一个比较大的改动&#xff0c;新增了不少端口(这里具体的就是bram的读写端口)&#xff0c;修改是在block design中右击IP编辑在IP编辑工程中进行的。 在修改完所有代码后&#xff08;顶层新增了需要新加的输入输出端口&…

【计算机网络 - 基础问题】每日 3 题(四十九)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

字节流写入文件

一、创建输出流对象表示的文件三种方式 方法一&#xff1a; FileOutputStream fos new FileOutputStream("fos.txt",true);//最简便方法二&#xff1a; FileOutputStream fos new FileOutputStream(new File("fos.txt"));方法三&#xff1b; File f ne…

HCIP-HarmonyOS Application Developer 习题(十四)

&#xff08;多选&#xff09;1、HarmonyOs为应用提供丰富的Al(Artificial Intelligence)能力&#xff0c;支持开箱即用。下列哪些是它拥有的AI能力? A、通用文字识别 B、词性标注 C、实体识别 D、语音播报 答案&#xff1a;ABCD 分析&#xff1a; AI能力简介二维码生成根据开…

软考高级系统分析师,快背,都是精华知识点!

19、需求变更控制 需求变更控制过程&#xff1a; &#xff08;1&#xff09;变更申请。应记录变更的提出人、日期、申请变更的内容等信息。 &#xff08;2&#xff09;变更评估。对变更的影响范围、严重程度、经济和技术可行性进行系统分析。 &#xff08;3&#xff09;变更…

qt/c++中成员函数返回成员变量并且可以赋值

#创作灵感 最近在做仪表项目&#xff0c;由于客户提供的仪表故障指示灯只有10个固定位置&#xff0c;而故障指示灯却有80多个。为了解决这个问题&#xff0c;进过我的设计&#xff0c;项目中需要返回类的成员变量。并且还可以赋值给它。于是就产生了下面的代码。 class Foo { …