MySQL中CURRENT_TIMESTAMP()加值异常及时间戳显示问题求助
问题解决与解释
一、TimeEnd字段值异常的问题
你直接用CURRENT_TIMESTAMP() + 30来加30秒的写法有问题,因为CURRENT_TIMESTAMP()返回的是字符串格式的日期时间(比如'2024-05-20 14:30:00'),MySQL会尝试把这个字符串隐式转换为数字再做加法。如果字符串开头能解析出数字(比如2024),加30后得到的是2054,这显然不是你要的30秒后;如果转换失败(比如某些时区或格式异常场景),就会得到0。
正确的做法是用MySQL的DATE_ADD()函数来做时间偏移,修改后的SQL语句如下:
database.query(`INSERT INTO bookrent (userID, bookID, bookRented , TimeStart, TimeEnd) VALUES ('${userBoughtItID}','${bookCheckID}',true, CURRENT_TIMESTAMP(), DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL 30 SECOND))`,(req1,res1) => {});
另外提醒一句:你现在用字符串拼接变量的写法有SQL注入风险,建议改用参数化查询,更安全也更规范:
database.query( 'INSERT INTO bookrent (userID, bookID, bookRented, TimeStart, TimeEnd) VALUES (?, ?, ?, CURRENT_TIMESTAMP(), DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL 30 SECOND))', [userBoughtItID, bookCheckID, true], (err, result) => { // 处理结果或错误 } );
二、Timestamp字段显示为Datetime格式的问题
MySQL的timestamp类型本质上存储的是Unix时间戳(从1970-01-01 00:00:00 UTC开始的秒数),但当你通过客户端工具(比如MySQL Workbench、Navicat)查询时,工具会自动将其转换为YYYY-MM-DD HH:MM:SS的datetime格式展示,目的是为了可读性更好。
如果你想查看原始的时间戳数值,可以用UNIX_TIMESTAMP()函数:
SELECT UNIX_TIMESTAMP(TimeStart), UNIX_TIMESTAMP(TimeEnd) FROM bookrent;
执行后就能看到存储的原始秒数了,字段本身的类型还是timestamp,只是显示格式被客户端工具转换了。
内容的提问来源于stack exchange,提问作者Thanos Rom
相关产品推荐
相关产品推荐

