在 MySQL 中獲取當前日期

Victor A. Oguntuase 2023年1月30日 2022年5月13日
  1. 使用 curdate() 函式獲取 MySQL 中的當前日期
  2. 使用 now() 函式獲取 MySQL 中的當前日期
在 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_TIMESTAMPLOCALTIME()LOCALTIMELOCALTIMESTAMP()LOCALTIMESTAMP

讓我們考慮一個簡單的例子,說明為什麼可能需要獲取當前日期。讓我們建立一個名為 students 的示例表,其中包含 idnamedate_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 A. Oguntuase avatar Victor A. Oguntuase avatar

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

相關文章 - MySQL Date