UNIX_TIMESTAMP()或FROM_UNIXTIME()函数中传递超出范围的值,MySQL将会返回什么?
在MySQL中,UNIX_TIMESTAMP()和FROM_UNIXTIME()是常用的时间日期函数,它们可以将日期时间转换为UNIX时间戳或将UNIX时间戳转换为日期时间。
UNIX时间戳指的是距离1970年1月1日午夜0时(格林威治标准时间)的秒数。一般来说,这个数值的范围应该在-2147483648(1901年12月13日20时45分52秒)到2147483647(2038年1月19日3时14分7秒)之间。
但是如果在UNIX_TIMESTAMP()或FROM_UNIXTIME()中传递的参数值超出了这个范围,MySQL将会返回什么呢?我们来进行实验。
阅读更多:MySQL 教程
实验前的准备工作
为了能够进行实验,我们需要创建一张测试表,并插入一些数据。
CREATE TABLE test_table (
id INT AUTO_INCREMENT PRIMARY KEY,
datetime DATETIME
);
INSERT INTO test_table (datetime)
VALUES ('2021-01-01 12:34:56'), ('2039-01-01 12:34:56'), ('1899-01-01 12:34:56');
上述代码创建了一张test_table表,包含两列,分别是id和datetime。其中,datetime列包含三个日期时间值,分别是2021年1月1日12时34分56秒、2039年1月1日12时34分56秒、1899年1月1日12时34分56秒。
实验过程
我们先来使用UNIX_TIMESTAMP()函数将datetime列中的日期时间转换为UNIX时间戳。
SELECT id, datetime, UNIX_TIMESTAMP(datetime) AS unix_timestamp
FROM test_table;
执行上述代码后,我们可以看到如下结果:
id | datetime | unix_timestamp |
---|---|---|
1 | 2021-01-01 12:34:56 | 1609516496 |
2 | 2039-01-01 12:34:56 | 0 |
3 | 1899-01-01 12:34:56 | -22089612504 |
上述结果中,第二行的unix_timestamp列返回了0,这是因为2039年1月1日12时34分56秒已经超出了UNIX时间戳的范围。
我们再来使用FROM_UNIXTIME()函数将UNIX时间戳转换为日期时间。
SELECT UNIX_TIMESTAMP(datetime), FROM_UNIXTIME(UNIX_TIMESTAMP(datetime)) AS datetime
FROM test_table;
执行上述代码后,我们可以看到如下结果:
UNIX_TIMESTAMP(datetime) | datetime |
---|---|
1609516496 | 2021-01-01 12:34:56 |
0 | 1970-01-01 08:00:00 |
-22089612504 | 1900-01-01 08:31:36 |
上述结果中,第二行的datetime列返回了1970年1月1日8时整,这是因为0已经超出了UNIX时间戳的范围。
结论
根据上述实验结果,我们可以得出结论:当UNIX_TIMESTAMP()或FROM_UNIXTIME()函数中传递超出范围的值时,MySQL将会返回0或1970年1月1日8时整(即UNIX时间戳的最小值)。
因此,在使用UNIX_TIMESTAMP()或FROM_UNIXTIME()函数时,我们应该注意传递的参数值是否在合法范围内。同时,由于不同的数据库系统对于超出范围的值的处理可能有所不同,我们在跨平台应用开发中,也需要格外注意。