一、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不會自動將毫秒部分加到秒上。
![]()