Mysql处理负值时间戳

6 篇文章 0 订阅

今天在业务层面遇到一个问题,我们以往如果在mysql中有个字段的格式是datetime,我们需要这个字段做筛选项的话,会这么写

if startTime != 0 {
	db = db.Where("unix_timestamp(created_at) >= ?", startTime)
}
if endTime != 0 {
	db = db.Where("unix_timestamp(created_at) <= ?", endTime)
}

可以看到我们其实是将数据库中的该字段从datetime转成了时间戳,然后和我们筛选的时间戳进行比较

在mysql中时间格式的字段使用datetime格式本来就是考虑到了一些时间字段可能会有1970年之前的值,比如生日birthday这样的,而我们今天遇到的问题就是

  1. mysql不接受负值的时间戳
  2. 即使字段格式为datetime,unix_timestamp(datetime)转化成时间戳后,时间戳还是从1970年开始的

在这里插入图片描述

图中可以很明显地看出,1970年之前的时间戳都是0,哪怕这个字段能够记录1800年之后的时间
这就使得当我们的筛选项需要用到1970年之前的时间的时候,上面那段代码将无法正常进行筛选
通过查百度得知,如果想要在mysql中使用负值时间戳,可以用

DATE_ADD(FROM_UNIXTIME(0), INTERVAL 时间戳 SECOND)

来实现,比如1800年1月1日早上8点

在这里插入图片描述

也就是说,用这种写法,可以将时间戳,包括负值时间戳,转化为mysql的datetime格式,然后我们就可以直接和字段值进行比较辣

SELECT * FROM `表名`  WHERE birthday <= DATE_ADD(FROM_UNIXTIME(0), INTERVAL 时间戳 SECOND);

在代码中的写法就要改成

if startTime != 0 {
	db = db.Where("birthday >= DATE_ADD(FROM_UNIXTIME(0), INTERVAL ? SECOND)", startTime)
}
if endTime != 0 {
	db = db.Where("birthday <= DATE_ADD(FROM_UNIXTIME(0), INTERVAL ? SECOND)", endTime)
}

实际执行逻辑就变成将我们传入的时间戳转换为datetime格式,然后直接与字段值进行比较
测试通过,盖姆欧瓦

参考文档

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值