当前时间:NOW()
当前时间:NOW()函数,传入参数是一个整数类型,传入参数可以是:空(0)、1~6;代表时间精度(秒后面的精度)。
SELECT NOW(), NOW(0), NOW(1), NOW(2), NOW(3), NOW(4), NOW(5), NOW(6);
如下:
NOW() | NOW(0) | NOW(1) | NOW(2) |
---|---|---|---|
2025-01-20 09:47:01 | 2025-01-20 09:47:01 | 2025-01-20 09:47:01.4 | 2025-01-20 09:47:01.40 |
second(s) | second(s) | decisecond(ds) | centisesond(cs) |
NOW(3) | NOW(4) | NOW(5) | NOW(6) |
---|---|---|---|
2025-01-20 09:47:01.405 | 2025-01-20 09:47:01.4052 | 2025-01-20 09:47:01.40525 | 2025-01-20 09:47:01.405254 |
millisecond(ms) | - | - | microsecond(μs) |
传入参数最大值是6,如果大于6会报错,错误代码: 1426
1 queries executed, 0 success, 1 errors, 0 warnings查询:SELECT NOW(7)错误代码: 1426
Too-big precision 7 specified for 'now'. Maximum is 6.执行耗时 : 0 sec
传送时间 : 0 sec
总耗时 : 0.008 sec
常用的当前时间有3种:
- NOW() 精确到秒的日期时间
- NOW(3) 精确到毫秒(千分之一秒)的日期时间
- NOW(6) 精确到微秒(千分之一毫秒,10的6次方分之一秒)的日期时间
UNIX时间戳
首先要知道当初UNIX时间戳是UNIX系统内核在里面使用的,因为其简单高效的特点逐渐被广泛使用。
unix时间戳:从1970年1月1日开始所经过的秒数。
Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
Unix 时间戳(英文为 Unix epoch, Unix time, POSIX time 或 Unix timestamp)
UNIX时间戳的 0 按照 ISO 8601 规范为 :1970-01-01T00:00:00Z.
注意:UNIX时间戳是包含时区的。咱们中国是“东八区”要在时间原点基础上+8小时。所以咱们中国地区的UNIX时间戳是从1970年1月1日 08:00:00开始所经过的秒数。
一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为86400秒,闰秒不计算。
时间 | 秒 |
---|---|
1 分钟 | 60 |
1 小时 | 3600 |
1 天 | 86400 |
1 周 | 604800 |
1 月 (30.44 天) | 2629743 |
1年 (365.24 天) | 31556736 |
2038年问题
在大多数的 Unix 系统中 Unix 时间戳存储为 32 位,这样会引发 2038 年问题或 Y2038。
MySQL内置函数 UNIX_TIMESTAMP() 与 FROM_UNIXTIME()
- UNIX_TIMESTAMP(日期时间格式) 用于将 日期时间格式 的参数转换为 UNIX时间戳。
- FROM_UNIXTIME(UNIX时间戳) 用于将 UNIX时间戳 转换为 日期时间格式。
秒级时间戳:
UNIX_TIMESTAMP('2025-01-20 09:23:51') |
UNIX_TIMESTAMP(NOW()) |
(UNIX_TIMESTAMP(NOW())* 1000) |
---|---|---|
1737336231 | 1737336231 | 1737336231000 |
FROM_UNIXTIME(1737336231) |
<- 同左边 | FROM_UNIXTIME(1737336231000 / 1000) |
2025-01-20 09:23:51 | <- 同左边 | 2025-01-20 09:23:51.0000 |
毫秒级时间戳:
(UNIX_TIMESTAMP(NOW(3))* 1000) |
(UNIX_TIMESTAMP(NOW(6))* 1000000) |
---|---|
1737340830990.000 | 1737341362745981.000000 |
FROM_UNIXTIME(1737340830990 / 1000) |
FROM_UNIXTIME(1737341362745981 / 1000000) |
2025-01-20 10:40:30.9900 | 2025-01-20 10:49:22.7459 |
FROM_UNIXTIME(1737340830990.000 / 1000) |
FROM_UNIXTIME(1737341362745981.000000 / 1000000) |
2025-01-20 10:40:30.990000 | 2025-01-20 10:49:22.745981 |
使用MySQL的BIGINT类型存储毫秒级时间戳
在很多应用中,我们需要存储时间戳来记录事件发生的时间。通常情况下,我们使用int整数类型来存储时间戳,比如UNIX时间戳。但是,在某些应用场景中,需要存储毫秒级的时间戳,此时使用BIGINT类型是一个不错的选择。在MySQL中,BIGINT类型可以存储很大范围的整数,范围从-9223372036854775808到9223372036854775807。这个范围完全可以覆盖毫秒级时间戳的取值范围。
示例:
首先,我们需要创建一个表格来存储时间戳。我们可以使用以下SQL语句创建一个名为 timestamp_table 的表格:
CREATE TABLE timestamp_table(id INT PRIMARY KEY AUTO_INCREMENT,timestamp_column BIGINT DEFAULT UNIX_TIMESTAMP(NOW(3))* 1000
);
在上面的SQL语句中,我们定义了一个名为 timestamp_column 的BIGINT类型的字段,它的默认值为当前时间的毫秒级时间戳。 UNIX_TIMESTAMP(NOW(3))* 1000 这段代码可以获取当前时间的毫秒级时间戳。
接下来,我们来插入一条数据到 timestamp_table 表格中:
INSERT INTO timestamp_table (timestamp_column) VALUES (UNIX_TIMESTAMP(NOW(3)) * 1000);
这样就可以将当前时间的毫秒级时间戳插入到 timestamp_table 表格中的 timestamp_column 字段中。
如果我们想查看所有的时间戳数据,可以使用以下SQL语句查询:
SELECT * FROM timestamp_table;
SELECT FROM_UNIXTIME(timestamp_column / 1000) AS TIME FROM timestamp_table;
解决“2038年问题”的一种方法
解决“2038年问题”的一种方法是将秒级时间戳也用bigint类型存储。
仍然以上面示例中的timestamp_table 的表格里面timestamp_column 字段为例。我们稍微修改一下创建表格的语句里面的默认值:
CREATE TABLE timestamp_table(id INT PRIMARY KEY AUTO_INCREMENT,timestamp_column BIGINT DEFAULT UNIX_TIMESTAMP(NOW())
);
在上面的SQL语句中,我们定义了一个名为 timestamp_column 的BIGINT类型的字段,它的默认值为当前时间的秒级时间戳。 UNIX_TIMESTAMP(NOW()) 这段代码可以获取当前时间的秒级时间戳。
来插入和读取秒级UNIX时间戳:
INSERT INTO timestamp_table (timestamp_column) VALUES (UNIX_TIMESTAMP(NOW())); # 插入秒级UNIX时间戳SELECT FROM_UNIXTIME(timestamp_column) AS TIME FROM timestamp_table; # 读取秒级UNIX时间戳
可以直接用这种方法来验证:SELECT NOW(), UNIX_TIMESTAMP(NOW());
【完】