首頁 > 軟體

MySQL中CURRENT_TIMESTAMP時間戳的使用詳解

2022-03-29 13:04:52

前言

最近在專案中發現一個小問題,資料被更改時,插入記錄和更新記錄的時間會被同步更新。設定的兩個時間create_time、update_time,按照預期來講,應該是建立記錄的時候會同步更新create_time,update_time,而在更新記錄的時候,只有update_time會被同步更新。但實際情況卻是update記錄時,兩個time都會被同步更新。

在程式碼中並沒有對時間進行顯性的設定,對時間的維護是MySQL本身進行管理的,所以就檢視了一下之前同事建立表時的SQL。

通過SQL語句可以看出,create_time 和 update_time 設定的都是 DEFAULT CURRENT_TIMESTAMP,不管是新建立的記錄,還是更新原有的記錄,只要是有觸發的操作,這兩個時間就會被同步修改。所以要達到預期的效果,就需要修改這裡了。問題根源就是SQL語句這裡的設定。

解決:

把update_time的 DEFAULT CURRENT_TIMESTAMP後面再加上條件限制 ON UPDATE CURRENT_TIMESTAMP。這樣在更新記錄時,只有更新時間被修改,建立時間就是最初建立記錄的時間。

MySQL中的CURRENT_TIMESTAMP:

在建立時間欄位的時候-----

① DEFAULT CURRENT_TIMESTAMP

表示當插入資料的時候,該欄位預設值為當前時間

② ON UPDATE CURRENT_TIMESTAMP

表示每次更新這條資料的時候,該欄位都會更新成當前時間

這兩個操作是mysql資料庫本身在維護,所以可以根據這個特性來生成【建立時間】和【更新時間】兩個欄位,且不需要程式碼來維護。

如下:

CREATE TABLE `mytest` (
    `id` bigint NOT NULL AUTO_INCREMENT,
    `comments` varchar(255) DEFAULT '' COMMENT '內容',
    `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
    `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

//如果想設定一個具體的預設時間可以這樣:
CREATE TABLE `mytest2` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `comments` varchar(255) DEFAULT '' COMMENT '內容',
  `create_time` timestamp DEFAULT '2020-12-12 12:12:12' COMMENT '建立時間',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

補充:mysql自帶的一些函數功能也是很強大的,這裡整理了一下時間方面的

獲取當前時間格式串:

#獲取當前時間戳
current_timestamp() yyyy-mm-dd hh:ii:ss 
now() yyyy-mm-dd hh:ii:ss
curdate() yyyy-mm-dd
current_date()
curtime() hh:ii:ss
current_time()

提取date各個欄位

#提取date各個欄位
date('yyyy-mm-dd hh:ii:ss') yyyy-mm-dd
year('yyyy-mm-dd hh:ii:ss') yyyy
month('yyyy-mm-dd hh:ii:ss') mm
day('yyyy-mm-dd hh:ii:ss') dd

提取time各個欄位

#提取time各個欄位
time('yyyy-mm-dd hh:ii:ss') hh:ii:ss
hour('yyyy-mm-dd hh:ii:ss') hh
minute('yyyy-mm-dd hh:ii:ss') ii
second('yyyy-mm-dd hh:ii:ss') ss

獲取當前或者某一時間的unix時間戳

#unix時間戳1970-01-01以來的秒數
unix_timestamp()
#同時還可以將某一時間格式串的秒數轉化出來
unix_timestamp('yyyy-mm-dd hh:ii:ss')

格式化時間串和格式化時間戳

#格式化時間串 date_format 與 time_format 為同一函數 輸入為 
date_format(now(), '%Y-%m-%d %T');
time_format(now(), '%H:%i:%s');
#格式化時間戳 將時間戳轉化為時間格式串
from_unixtime(unix_timestamp(), "%Y-%m-%d %T")

總結

到此這篇關於MySQL中CURRENT_TIMESTAMP時間戳使用的文章就介紹到這了,更多相關MySQL CURRENT_TIMESTAMP時間戳內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com