最近同事用到了这类sql,记录如下:

 

1.首先,数据库表userinfo中,有一个updatetime字段,该字段的格式是bigint(最大长度20),保存的是13位的时间戳,例如:

updatetime

1610467200666

 

2.要在查询时把这个字段转成格式化日期,可以使用from_unixtime()方法,如下:

select from_unixtime(round(updatetime/1000,0)) from userinfo;

这句的意思是先把updatetime/1000,然后使用round()方法转为四舍五入后含有0位小数的bigint,然后使用from_unixtime()方法将bigint转为格式化日期。

使用round并除以1000的意思是,由于数据库中保存的是13位的时间戳,因此要先转成秒,然后再用from_unixtime,否则无法返回正确结果。

返回的结果样例:

//没有加列名,所以列名默认就这么长了
from_unixtime(round(upd...
2021-01-13 00:00:01
2021-01-12 01:00:01
2021-01-11 02:00:01
2021-01-10 03:00:01
...

3.这个格式化日期并不是想要的格式,所以继续用DATE_FORMAT方法,继续转换格式,如下:

select DATE_FORMAT(from_unixtime(round(updatetime/1000,0)),'%Y-%m-%d') from userinfo;

这次增加了DATE_FORMAT方法,注意使用的是'%Y-%m-%d',大写的Y,所以结果如下:

DATE_FORMAT(from_unix...
2021-01-13
2021-01-11
...

如果使用'%y-%m-%d',小写的y,则结果如下:

DATE_FORMAT(from_unix...
21-01-13
21-01-11
...

 

4.明白了如何把时间戳转为格式化日期后,就进行最后一步、实现需求了。

例如,查询最近2天的数据,updateTime是时间戳,不太好比较时,可以用下方的sql:

select curdate() - interval 3 day, DATE_FORMAT(from_unixtime(round(a.updatetime/1000,0)), a.* 
from userinfo a
where DATE_FORMAT(from_unixtime(round(a.updatetime/1000,0)),'%Y-%m-%d') > (curdate() - interval 3 day);

这句sql中,curdate() - interval 3 day 得到的结果是,当前时间减去3天的时间;

然后查询字段updatetime(时间戳格式的时间)大于前3天的数据,也就是最近2天的时间;

开头例子中只用a.*即可,多余的2个是为了显示结果方便一些。

注意,date_format()方法中,要使用'%Y-%m-%d',大写Y,然后日期格式才正确,才能正确使用大于小于号比较时间!

(如果使用小写y,'%y-%m-%d',会是【21-01-13 > 2021-01-10】的比较,会存在问题)

结果样例如下:

//第一行是列名,因为没有起,所以都是默认的列名;省略不重要的列
curdate()-interval 3 day   DATE_FORMAT(from_unix...      username  phone   updatetime
2021-01-10                 2021-01-13                     小明     188...   1610467200666

 

5.如果要在sql中将格式化日期转为时间戳,可以使用UNIX_TIMESTAMP()方法,简述如下:

数据库表userinfo中,synctime字段,格式为datetime。

使用sql,可以转化为长度10位的时间戳,意思是单位为秒。

select UNIX_TIMESTAMP(synctime) from userinfo;

结果样例如下:

//第一行是列名,第二行是结果
UNIX_TIMESTAMP(syncti...
1610478685
......