在 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
数据类型存储的。像这样存储值可以提高内存效率,因为我们的年龄数据很小。
这是官方文档中关于各种整数数据类型。
现在我们可以更新 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
相关文章
如何在 MySQL 中声明和使用变量
发布时间:2024/03/26 浏览次数:102 分类:MySQL
-
当你需要在 MySQL 中的脚本中存储单个值时,最好的方法是使用变量。变量有不同的种类,有必要知道何时以及如何使用每种类型。
在 MySQL 中使用 Mysqladmin 刷新主机解除阻塞
发布时间:2024/03/26 浏览次数:53 分类:MySQL
-
你将了解阻止主机的原因。此外,通过使用 phpMyAdmin 和命令提示符刷新主机缓存来解除阻塞的不同方法和效果。