何大土  

一、MySQL中datetime类型怎么处理毫秒

MySQL中datetime日期类型,默认是精确到秒的。从MySQL5.6.4版本开始,可以设置精度,如datetime(3)表示精确到毫秒

类型 说明 插入时赋值 DB实际存储
datetime(0)或datetime 精确到秒

2024-05-19 00:00:00:499

2024-05-19 00:00:00:500

2024-05-19 00:00:00

2024-05-19 00:00:01

datetime(3) 精确到毫秒

2024-05-19 00:00:00:499

2024-05-19 00:00:00:500

2024-05-19 00:00:00:499

2024-05-19 00:00:00:500

实验:

数据库版本: MySQL5.7.34

表定义:

create table date_test
(
    id              int auto_increment primary key,
    date_field      date                                null,
    datetime_field  datetime                            null,
    datetime3_field datetime(3)                         null,
    timestamp_field timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP,
    remark          int                                 null
);

插入2024-05-18 23:59:59:000 ~ 2024-05-19 00:00:01:000,每1毫秒插入一条数据

  @Test
	public void testInsert(){
		List<DateTestDO> dateTestDOList= new ArrayList<>();
		//2024-05-19 00:00:00 减去一秒
		long timeStamp = 1716048000000L - 1000L;
		for (int i = 0; i <=2000 ; i++) {
			long time = timeStamp+i;
			Date date = new Date(time);
			DateTestDO dateTestDO = new DateTestDO();
			dateTestDO.setDateField(date);
			dateTestDO.setDatetimeField(date);
			dateTestDO.setDatetime3Field(date);
			dateTestDO.setTimestampField(date);
			dateTestDO.setRemark(i+1);
			dateTestDOList.add(dateTestDO);
		}
		dateTestDao.batchInsert(dateTestDOList);
	}

观察DB数据:

datetime(0)类型,毫秒数小于500时直接舍弃;毫秒数大于等于500时+1秒

datetime(3)类型,能保存毫秒数,不会加1秒

 

二、按datetime(0)类型字段检索时有精度问题吗?

例如需要查询2024-05-19这一天中的所有订货单,订单日期查询条件为 2024-05-19 00:00:00:000 ~ 2024-05-19 23:59:59:999,订单日期使用 datetime进行存储,时间部分固定全为0,如2024-05-18 00:00:00

构造实验数据:2024-05-10~2024-05-20每天保存一张订货单,时间部分都是0,例如2024-05-10 00:00:00:000

查询代码:

  @Test
	public void testQuery(){
		//2024-05-18 00:00:00:000
		long startTime = 1715961600000L;
		//2024-05-18 23:59:59:999
		long endTime = 1716047999999L;
		List<DateTestDO> dateTestDOS = dateTestDao.queryByDate(new Date(startTime), new Date(endTime));
		System.out.println(dateTestDOS.size());
		System.out.println(dateTestDOS.get(0));
		System.out.println(dateTestDOS.get(dateTestDOS.size()-1));
	}
    <select id="queryByDate" resultType="cn.hekui.model.DateTestDO">
        select * from date_test
        where datetime_field >= #{start,jdbcType=TIMESTAMP} and datetime_field <= #{end,jdbcType=TIMESTAMP};
    </select>

在上面的插入实验中,毫秒数大于500时会加一秒,那查询条件中的 end时间为2024-05-18 23:59:59:999会进位为 2024-05-19 00:00:00吗?会查出05-19的记录吗?

查询结果如下:

可以看到查询结果只有1条,只查询到了05-18的记录,并没有查询到05-19的记录。

结论:在进行日期查询时,MySQL不会自动将毫秒部分加到秒上。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


posted on 2024-05-19 10:36  何大土  阅读(70)  评论(0编辑  收藏  举报