MySQL SYSDATE()、NOW()、CURRENT_TIMESTAMP和CURRENT_TIMESTAMP()的区别
在MySQL中,SYSDATE()、NOW()、CURRENT_TIMESTAMP和CURRENT_TIMESTAMP()都可以用来获取当前的时间和日期,它们看起来非常相似,但它们实际上有着微妙的区别。在本文中,我们将深入研究这些函数的差异,并根据实际案例进行说明。
阅读更多:MySQL 教程
SYSDATE()
在MySQL中,SYSDATE()是一个函数,用于返回当前的日期和时间。它的语法如下:
SYSDATE()
这个函数返回一个日期和时间值,其数据类型为日期时间类型。
这个函数的特点是返回当前系统时间戳,而不是每次操作完成后的固定时间戳。这就是说,如果你在同一个操作中多次调用SYSDATE(),每次都会返回新的时间戳。
举个例子,假设现在时间是2019年12月21日15:16:17,运行以下代码:
SELECT SYSDATE(), SYSDATE(), SYSDATE();
它的结果应该类似于:
+---------------------+---------------------+---------------------+
| SYSDATE() | SYSDATE() | SYSDATE() |
+---------------------+---------------------+---------------------+
| 2019-12-21 15:16:17 | 2019-12-21 15:16:17 | 2019-12-21 15:16:17 |
+---------------------+---------------------+---------------------+
你可以看到,每次调用SYSDATE()都会返回一个新的时间戳。
NOW()
在MySQL中,NOW()函数和SYSDATE()函数的作用是相同的。它也用于返回当前的日期和时间。下面是NOW()函数的语法:
NOW()
与SYSDATE()函数不同的是,NOW()函数在一个基于语句的上下文中只执行一次,因此,它将在这个执行上下文中返回一个固定的时间戳。这个特性的影响是,如果在同一个语句中多次使用NOW()函数,它将只返回一个固定的时间戳。
例如,假设执行以下代码:
SELECT NOW(), NOW(), NOW();
它的结果将类似于:
+---------------------+---------------------+---------------------+
| NOW() | NOW() | NOW() |
+---------------------+---------------------+---------------------+
| 2019-12-21 15:16:17 | 2019-12-21 15:16:17 | 2019-12-21 15:16:17 |
+---------------------+---------------------+---------------------+
你可以看到,在同一个语句中调用NOW()函数返回的都是相同的时间戳。
CURRENT_TIMESTAMP
在MySQL中,CURRENT_TIMESTAMP是一个用于返回当前日期和时间的函数。下面是CURRENT_TIMESTAMP函数的语法:
CURRENT_TIMESTAMP
与SYSDATE()和NOW()函数不同的是,CURRENT_TIMESTAMP即可以是一个函数也可以是一个关键字。如果在SELECT语句中使用,CURRENT_TIMESTAMP会当作函数来执行,与SYSDATE()和NOW()函数的结果一样。如果在插入或更新操作中使用,则会将当前日期和时间作为默认值插入或更新对应列。
例如,在SELECT语句中,如果你使用如下的代码:
SELECT CURRENT_TIMESTAMP, CURRENT_TIMESTAMP();
它的输出将类似于:
+---------------------+---------------------+
| CURRENT_TIMESTAMP | CURRENT_TIMESTAMP() |
+---------------------+---------------------+
| 2019-12-21 15:16:17 | 2019-12-21 15:16:17 |
+---------------------+---------------------+
你可以看到,CURRENT_TIMESTAMP()和CURRENT_TIMESTAMP返回的结果相同。在INSERT或UPDATE语句中,你可以像下面这样使用CURRENT_TIMESTAMP:
INSERT INTO my_table (id, created_time) VALUES (1, CURRENT_TIMESTAMP);
这将在给定的id和当前时间戳在my_table表中添加一行数据。
CURRENT_TIMESTAMP()
与CURRENT_TIMESTAMP相似, CURRENT_TIMESTAMP()函数也可以用于获取当前的日期和时间。下面是CURRENT_TIMESTAMP()的语法:
CURRENT_TIMESTAMP()
和NOW()函数类似,CURRENT_TIMESTAMP()函数在基于语句的上下文中只执行一次,并返回一个固定的时间戳。因此,在同一个语句中多次调用CURRENT_TIMESTAMP()函数也只返回一个固定的时间戳,与使用NOW()函数的结果是一样的。
例如,假设我们执行以下代码:
SELECT CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP();
它的结果应该是:
+---------------------+---------------------+---------------------+
| CURRENT_TIMESTAMP() | CURRENT_TIMESTAMP() | CURRENT_TIMESTAMP() |
+---------------------+---------------------+---------------------+
| 2019-12-21 15:16:17 | 2019-12-21 15:16:17 | 2019-12-21 15:16:17 |
+---------------------+---------------------+---------------------+
你可以看到,CURRENT_TIMESTAMP()函数在同一个语句中返回的是相同的时间戳。
示例说明
为了更好地理解SYSDATE()、NOW()、CURRENT_TIMESTAMP和CURRENT_TIMESTAMP()的区别,我们可以参考下面的示例。
假设我们使用以下CREATE TABLE语句创建一个名为“my_table”的表:
CREATE TABLE my_table (
id INT AUTO_INCREMENT PRIMARY KEY,
date_time1 DATETIME DEFAULT CURRENT_TIMESTAMP,
date_time2 DATETIME DEFAULT NOW(),
date_time3 DATETIME DEFAULT SYSDATE(),
date_time4 DATETIME DEFAULT CURRENT_TIMESTAMP()
);
这个表包含一个自动增长的id列,以及四个DATETIME类型的时间戳列,分别使用CURRENT_TIMESTAMP、NOW()、SYSDATE()和CURRENT_TIMESTAMP()作为默认值。
接下来,我们插入一行数据:
INSERT INTO my_table (id) VALUES (1);
然后,我们可以执行以下SELECT语句来查看它们的值:
SELECT * FROM my_table;
它的输出应该类似于:
+----+---------------------+---------------------+---------------------+---------------------+
| id | date_time1 | date_time2 | date_time3 | date_time4 |
+----+---------------------+---------------------+---------------------+---------------------+
| 1 | 2019-12-21 15:51:30 | 2019-12-21 15:51:30 | 2019-12-21 15:51:30 | 2019-12-21 15:51:30 |
+----+---------------------+---------------------+---------------------+---------------------+
你可以看到,所有四个时间戳列返回的时间戳值都是相同的。
现在,我们再插入一行数据:
INSERT INTO my_table (id, date_time1, date_time2, date_time3, date_time4) VALUES (
2,
CURRENT_TIMESTAMP,
NOW(),
SYSDATE(),
CURRENT_TIMESTAMP()
);
然后,我们可以再次执行以下SELECT语句来查看它们的值:
SELECT * FROM my_table;
这次输出应该类似于:
+----+---------------------+---------------------+---------------------+---------------------+
| id | date_time1 | date_time2 | date_time3 | date_time4 |
+----+---------------------+---------------------+---------------------+---------------------+
| 1 | 2019-12-21 15:51:30 | 2019-12-21 15:51:30 | 2019-12-21 15:51:30 | 2019-12-21 15:51:30 |
| 2 | 2019-12-21 16:02:41 | 2019-12-21 16:02:41 | 2019-12-21 16:02:41 | 2019-12-21 16:02:41 |
+----+---------------------+---------------------+---------------------+---------------------+
你可以看到,第二行数据的时间戳列返回的值是不同的,因为它们使用了当前的时间戳作为插入值。
总结
在MySQL中,SYSDATE()、NOW()、CURRENT_TIMESTAMP和CURRENT_TIMESTAMP()都可以用于获取当前的日期和时间,它们的语法非常相似。然而,它们之间的微妙差别可能导致意想不到的问题。下面是总结它们的区别:
- SYSDATE():每次调用都返回一个新的时间戳;
- NOW():在同一个基于语句的上下文中,每次调用都返回一个相同的时间戳;
- CURRENT_TIMESTAMP:在SELECT语句中,每次调用都返回一个新的时间戳;在INSERT或UPDATE语句中,使用当前的时间戳插入或更新对应列;
- CURRENT_TIMESTAMP():与NOW()函数类似,在同一个基于语句的上下文中,每次调用都返回一个相同的时间戳。
因此,在使用这些函数时,要根据需要选择正确的函数,以避免不必要的问题。