在 MySQL 中獲取當前日期
使用資料庫時,通常會出現各種用例來實現。當需要從系統中獲取當前日期進行計算時,MySQL 中的 curdate()
或 now()
函式是可行的工具。
使用 curdate()
函式獲取 MySQL 中的當前日期
根據此函式的官方文件,它返回查詢的當前日期的值。此返回是日期資料型別,可以為資料庫中的資訊或計算目的進行格式化或操作。
curdate()
函式具有以相同方式工作的同義詞函式,即 current_date()
、current_date
。
curdate()
函式及其同義詞的使用在以下程式碼塊中進行了說明。
-- Testing out various current date functions in mysql
SELECT curdate() as "Today's date with curdate";
SELECT current_date() as "Today's date with current_date()";
SELECT current_date as "Today's date with current_date";
輸出:
Today's date with curdate
2022-02-03
0.000 sec / 0.000 sec
1 row(s) returned
-----------------------------------------------------------------------------------------
Today's date with current_date()
2022-02-03
0.015 sec / 0.000 sec
1 row(s) returned
-----------------------------------------------------------------------------------------
Today's date with current_date
2022-02-03
0.000 sec / 0.000 sec
1 row(s) returned
從查詢的速度可以看出,curdate()
函式獲取當前日期的速度足夠快。此外,它的同義詞/別名之一 current_date()
需要更長的時間。
雖然對於小型資料集和查詢來說,幾秒鐘似乎微不足道,但對於大規模應用程式來說,就會出現嚴重的問題。
使用 now()
函式獲取 MySQL 中的當前日期
now()
函式,與 curdate()
函式或其同義詞/別名相反,返回當天的日期時間。
由於 datetime 由兩部分組成,即日期和時間,因此需要一個外部日期抓取函式,如 extract()
或 date()
來獲取所需的資料。
可通過此文件獲得從日期時間中提取日期元素的良好參考。
-- Illustrating the now() function
SELECT now() as "Today's datetime", date(now()) as "Today's date";
輸出:
Today's datetime Today's date
2022-02-03 20:25:03 2022-02-03
-----------------------------------------------------------------------------------------
0.000 sec / 0.000 sec
1 row(s) returned
now()
函式還有同義詞,如 CURRENT_TIMESTAMP()
、CURRENT_TIMESTAMP
、LOCALTIME()
、LOCALTIME
、LOCALTIMESTAMP()
、LOCALTIMESTAMP
。
讓我們考慮一個簡單的例子,說明為什麼可能需要獲取當前日期。讓我們建立一個名為 students
的示例表,其中包含 id
、name
和 date_of_birth
。
/* Creating a sample table for illustrating a use-case of the current date methods */
CREATE TABLE students(
id INT AUTO_INCREMENT,
name VARCHAR(255),
date_of_birth date,
PRIMARY KEY(id)
);
-- Populating the students table
INSERT INTO students(name, date_of_birth) VALUES
('Susan Doyle', '1991-02-24'),
('James Maddison', '1991-07-22'),
('Christine Pile', '1993-09-02'),
('Damien Black', '1987-03-14');
-- Viewing the table
SELECT * FROM students;
輸出:
id name date_of_birth
1 Susan Doyle 1991-02-24
2 James Maddison 1991-07-22
3 Christine Pile 1993-09-02
4 Damien Black 1987-03-14
-----------------------------------------------------------------------------------------
0.969 sec
0 row(s) affected
0.516 sec
4 row(s) affected Records: 4 Duplicates: 0 Warnings: 0
0.000 sec / 0.000 sec
4 row(s) returned
現在,讓我們新增一個名為 age
的額外列。此列將計算每個學生的年齡作為當年與其出生日期之間的差異。
-- Modifying the existing table to add a new column
ALTER TABLE students
ADD AGE TINYINT;
輸出:
0.766 sec
0 row(s) affected Records: 0 Duplicates: 0 Warnings: 0
請注意,該值是使用 TINYINT
資料型別儲存的。像這樣儲存值可以提高記憶體效率,因為我們的年齡資料很小。
這是[官方文件] - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT") 關於各種整數資料型別。
現在我們可以更新 AGE
列的值。
/* Updating the table with values. The 'generated always' constraint would have been an excellent way to implement this. However, it does not accept the curdate() nor now() function (nor their aliases) */
UPDATE students
SET AGE = (SELECT (YEAR(CURDATE()) - YEAR(students.date_of_birth))) -- using curdate()
WHERE students.id > 0;
輸出:
0.140 sec
4 row(s) affected Rows matched: 4 Changed: 4 Warnings: 0
讓我們預覽一下我們的決賽桌。
SELECT * FROM students;
輸出:
id name date_of_birth AGE
1 Susan Doyle 1991-02-24 31
2 James Maddison 1991-07-22 31
3 Christine Pile 1993-09-02 29
4 Damien Black 1987-03-14 35
-----------------------------------------------------------------------------------------
0.000 sec / 0.000 sec
4 row(s) returned
當前的方法有效。但是,可以改進結果以正確更新生日距離當前日期還很遠的學生的年齡。
我們將 DATEDIFF
函式與 FLOOR
函式相結合來實現此結果。
-- Improving the age update algorithm
UPDATE students
SET AGE = (SELECT FLOOR(DATEDIFF(CURDATE(),students.date_of_birth)/365))
WHERE students.id > 0;
SELECT * FROM students;
輸出:
id name date_of_birth AGE
1 Susan Doyle 1991-02-24 30
2 James Maddison 1991-07-22 30
3 Christine Pile 1993-09-02 28
4 Damien Black 1987-03-14 34
-----------------------------------------------------------------------------------------
0.093 sec
4 row(s) affected Rows matched: 4 Changed: 4 Warnings: 0
0.000 sec / 0.000 sec
4 row(s) returned
Victor is an experienced Python Developer, Machine Learning Engineer and Technical Writer with interests across various fields of science and engineering. He is passionate about learning new technologies and skill and working on challenging problems. He enjoys teaching, intellectual discourse, and gaming, among other things.
LinkedIn GitHub