1、使用 NOW() 、 CURDATE()、CURTIME() 获取当前时间

在这里我有一个问题想问问大家,你们平时都是怎么样子获取时间的呢?是不是通过手表、手机、电脑等设备了解到的,那么你们有没有想过在在我们 SQL 中是怎么样获得时间的呢?

和其他的语言一样,我们的 SQL 语言也有着属于我们自己的获取时间的方式,接下来就让我带领大家一起来学习一下 SQL 语言是怎么样获取时间的吧。

在 SQL 中,我们可以通过使用 NOW()、CURDATE()、CURTIME() 来获取当前的时间

  • NOW() 可以用来返回当前日期和时间 格式:YYYY-MM-DD hh:mm:ss
  • CURDATE() 可以用来返回当前日期 格式:YYYY-MM-DD
  • CURTIME() 可以用来返回当前时间 格式:hh:mm:ss

在使用 NOW() 和 CURTIME() 时,如果要精确的秒以后的时间的话,可以在()中加数字,加多少,就表示精确到秒后多少位
比如 NOW(3) 就是精确到毫秒,表示为: 2022-03-11 15:27:20.645

????我们可以通过下面的示例来感受一下 NOW () 、CURDATE () 、 CURTIME () 的用法

使用 NOW() 、 CURDATE() 、CURTIME() 函数查询当前日期与时间,并用 current_datetime 、current_date、current_time 作为结果集列名。

mysql> SELECT NOW() AS `current_datetime`,
    -> CURDATE() AS `current_date`,
    -> CURTIME() AS `current_time`;
+---------------------+------------+----------+
| currentDate         | curdate    | cyrtime  |
+---------------------+------------+----------+
| 2023-03-11 13:20:01 | 2023-03-11 | 13:20:01 |
+---------------------+------------+----------+
1 row in set (0.00 sec)

通过上面的示例我们可以看出 NOW() 、 CURDATE() 、CURTIME() 这三个函数有着相似处,也有着一些不同。在实际的案例中,我们可以根据不同的情况,运用不同的函数来达到自己目的。

????我们可以通过下面的实例来感受一下 NOW () 的用法。

使用 NOW() 向记录表 records 中插入当前的时间(精确到毫秒)

mysql> INSERT INTO `records` VALUES (NOW(3));
Query OK, 1 row affected

mysql> SELECT `now_time` FROM `records`;
+-------------------------+
| now_time                |
+-------------------------+
| 2021-03-31 15:31:49.091 |
+-------------------------+
2 rows in set

接下来做一个小练习:

向表中插入当前的日期

请编写 SQL 语句,向记录表 records 中插入当前的日期。

表定义: records (记录表)

列名 类型 注释
now_time date 现在时间
-- Write your SQL Query here --
-- example: INSERT INTO XX_TABLE VALUES XXX --
INSERT INTO records VALUES (NOW());

2、使用 DATE()、TIME() 函数提取日期和时间

我们将会学习如何将时间中的代表日期的元素和代表时间的元素从时间中提取出来。

就以上一节我们获得的 current_datetime 来说吧,我们已经知道了“现在”的时间是 '2021-03-25 16:16:30',但是在实际运用中,不需要这么的精确,只需要其中的日期或者时间,那么我们应该怎么做呢。或许你会想到再用 CURDATE() 或者CURTIME() 把需要的日期或者时间获取出来不就行了吗。但是你有没有想过时间是会变的, CURDATE() 或者CURTIME() 都是获取当前的,而在某些情况下,时间是固定的,那么我们应该怎么办呢?接下来让我带领大家一起来学习一下如何将时间中的代表日期的元素和代表时间的元素从时间中提取出来。

????我们可以通过下面的示例来感受一下 DATE () 、TIME () 的用法

使用 DATE()、TIME() 函数分别将 '2021-03-25 16:16:30' 这组数据中的日期于时间提取出来,并用 date 、time 作为结果集列名。

SELECT DATE('2021-03-25 16:16:30') AS `date`,TIME('2021-03-25 16:16:30')  AS `time`;
+------------+----------+
| date       | time     |
+------------+----------+
| 2021-03-25 | 16:16:30 |
+------------+----------+
1 row in set

通过上面的示例,你是否能理解 DATE()、TIME() 的用法呢?那么让我来考考你吧。在不使用 CURDATE() 函数的情况下,通过这两节我们学到的时间函数方面的知识,将多个函数进行组合的形式来达到相同的效果呢?

如果可以的话说明你已经初步理解了这两节讲到的知识了,那么让我们一起来看看到底应该怎么做呢。

首先我们可以通过 NOW() 获得当前的时间与日期,再使用 DATE() 函数将其中的日期提取出来,具体的用法是这样子的 DATE(NOW()),我们在把他与 CURDATE() 比较一下吧!

mysql> SELECT DATE(NOW()),CURDATE();
+-------------+------------+
| DATE(NOW()) | CURDATE()  |
+-------------+------------+
| 2021-03-25  | 2021-03-25 |
+-------------+------------+
1 row in set

????我们可以通过下面的实例来感受一下 DATE () 的用法。

2.1查询课程表中课程的创建日期:

使用 DATE() 函数从课程表 courses 中查询课程的名字 name 和课程创建时间 created_at,从课程创建时间 created_at 中提取出创建课程的日期,并加以格式化,用 created_date 作为结果集列名。

mysql> SELECT `name`, DATE(`created_at`) AS `created_date`
    -> FROM `courses`;
+-------------------------+--------------+
| name                    | created_date |
+-------------------------+--------------+
| Advanced Algorithms     | 2020-06-01   |
| System Design           | 2020-07-18   |
| Django                  | 2020-02-29   |
| Web                     | 2020-04-22   |
| Big Data                | 2020-09-11   |
| Artificial Intelligence | 2018-05-13   |
| Java P6+                | 2019-01-19   |
| Data Analysis           | 2019-07-12   |
| Object Oriented Design  | 2020-08-08   |
| Dynamic Programming     | 2018-08-18   |
+-------------------------+--------------+
10 rows in set

2.2分别查询出课程表的课程创建时间中的日期与时间

使用 DATE() 、 TIME() 函数从课程表 courses 中查询课程的名字 name 和课程创建时间 created_at,从课程创建时间 created_at 中提取出创建课程的日期与时间,用 created_date 和 created_time 作为结果集列名。

mysql> SELECT `name`, `created_at`, 
    -> DATE_FORMAT(DATE(`created_at`),"%Y-%m-%d") AS `created_date`,
    -> DATE_FORMAT(TIME(`created_at`),"%H:%i:%s") AS `created_time`
    -> FROM `courses`;
+-------------------------+---------------------+--------------+--------------+
| name                    | created_at          | created_date | created_time |
+-------------------------+---------------------+--------------+--------------+
| Advanced Algorithms     | 2020-06-01 09:10:12 | 2020-06-01   | 09:10:12     |
| System Design           | 2020-07-18 10:11:12 | 2020-07-18   | 10:11:12     |
| Django                  | 2020-02-29 12:10:12 | 2020-02-29   | 12:10:12     |
| Web                     | 2020-04-22 13:01:12 | 2020-04-22   | 13:01:12     |
| Big Data                | 2020-09-11 16:01:12 | 2020-09-11   | 16:01:12     |
| Artificial Intelligence | 2018-05-13 18:12:30 | 2018-05-13   | 18:12:30     |
| Java P6+                | 2019-01-19 13:31:12 | 2019-01-19   | 13:31:12     |
| Data Analysis           | 2019-07-12 13:01:12 | 2019-07-12   | 13:01:12     |
| Object Oriented Design  | 2020-08-08 13:01:12 | 2020-08-08   | 13:01:12     |
| Dynamic Programming     | 2018-08-18 20:01:12 | 2018-08-18   | 20:01:12     |
+-------------------------+---------------------+--------------+--------------+
10 rows in set

3、使用 EXTRACT() 函数提取指定的时间信息

前面我们已经学习了 DATE 函数和 TIME 函数,明白 DATE 返回日期, TIME 返回时间,如果我只想知道年份的信息或者小时的信息,那么该怎么解决呢?这时,我们就可以使用 EXTRACT() 函数来解决问题。

EXTRACT() 函数用于返回日期/时间的单独部分,如 YEAR (年)、MONTH (月)、DAY (日)、HOUR (小时)、MINUTE (分钟)、 SECOND (秒)。

SELECT EXTRACT(unit FROM date)
FROM `table`

其中:

  • table 是表格名

  • date 参数是合法的日期表达式。

  • unit 参数是需要返回的时间部分,如 YEAR 、MONTH 、 DAY 、 HOUR 、MINUTE 、SECOND 等。

在一般情况下,EXTRACT(unit FROM date) 与 unit() 的结果相同。

????我们可以通过下面的实例来感受一下 EXTRACT() 函数 的用法。
使用 EXTRACT() 函数,从课程表 courses 中查询课程的名字和创建时间的小时数,并为 created_at 起别名为 created_hour 。

mysql> SELECT `name`, EXTRACT(HOUR FROM `created_at`) AS `created_hour`
FROM `courses`;
+-------------------------+--------------+
| name                    | created_hour |
+-------------------------+--------------+
| Advanced Algorithms     | 9            |
| System Design           | 10           |
| Django                  | 12           |
| Web                     | 13           |
| Big Data                | 16           |
| Artificial Intelligence | 18           |
| Java P6+                | 13           |
| Data Analysis           | 13           |
| Object Oriented Design  | 13           |
| Dynamic Programming     | 20           |
+-------------------------+--------------+
10 row in set

4、使用DATE_FORMAT()格式化输出日期

格式化输出日期

4.1DATE_FORMAT()用法

我们在 SQL 中使用 DATE_FORMAT() 方法来格式化输出 date/time。
需要注意的是 DATE_FORMAT() 函数返回的是字符串格式。

SELECT DATE_FORMAT(date,format);

其中

  • date 是一个有效日期
  • format 是 date/time的输出格式

4.2DATE_FORMAT()实例

????我们可以通过下面的实例来感受一下 DATE_FORMAT() 的用法。

假如我们要得到 courses 表课程创建时间的月份,日期,年份,星期。
我们可以使用下面的 SQL 语句:

SELECT DATE_FORMAT(`created_at`, '%Y %m ') AS `DATE_FORMAT`
FROM `courses`;

其中 %m 表示月份,%d 表示日期,%Y 表示年份,%w 表示星期。

mysql> SELECT DATE_FORMAT(`created_at`, '%Y %m') AS `DATE_FORMAT`
    -> FROM `courses`;
+-------------+
| DATE_FORMAT |
+-------------+
| 2020 06     |
| 2020 07     |
| 2020 02     |
| 2020 04     |
| 2020 09     |
| 2018 05     |
| 2019 01     |
| 2019 07     |
| 2020 08     |
| 2018 08     |
+-------------+
10 rows in set (0.01 sec)

请编写 SQL 语句,查询 courses 表,查询课程创建时间,按照 ’yyyy-MM-dd HH:mm:ss’ 的格式返回结果,返回列名显示为 DATE_FORMAT。

-- Write your SQL Query here --
-- example: SELECT * FROM XX_TABLE --
SELECT DATE_FORMAT(`created_at`,'%Y-%m-%d %H:%i:%s') as DATE_FORMAT FROM courses

常见的输出格式:
image