点击关注公众号,SQL干货及时获取
后台回复:1024,获取海量学习资源
往期热文
年薪200万的阿里P9,试用期转正失败。
gap了9个月,终于找到工作了。
长见识了,新型 0 成本裁员方式。
大家好,我是岳哥。
最近看到京东2025届校招启动了,开放1.8万个岗位,包含1.2万个2025年应届生和6000多个实习生岗位,同时薪资将全面上调,再次加薪,羡煞旁人!

特别是算法岗涨幅超75%,涨幅最高,东哥对人才还是舍得下本钱。
京东的校招开发岗在大厂里也不低,非常具有竞争力。
这是京东2024届技术岗的校招薪资水平:
算法岗:月薪25.5k~30k,16个月薪资,年包:41w~48w。
开发岗:月薪23k~27.5k,16个月薪资,年包:36w~44w。
产品岗:月薪18k~23k,16个月薪资,年包:29w~39w。
咱们社招的同学跳槽能有20%就很不错了,假如都只按20%的涨幅,今年京东校招开发岗的薪资大概是:
算法岗:月薪30.6k~36k,16个月薪资,年包:49w~58w。
开发岗:月薪23k~27.5k,16个月薪资,年包:44w~53w。
产品岗:月薪18k~23k,16个月薪资,年包:34w~44w。
现在秋招已经开始了,大概等到10月份大多数公司就会开奖了,到时候大家可以看下差距大不大。
以下是今天的SQL干货
有如下一张记录表T20191105,如何查询出每隔15分钟的记录数

预期结果如下:

参考答案
create table T20191105
(
ID int,
Timesvarchar(50)
);
insert into T20191105 values(1,'2019-12-25 11:01');
insert into T20191105 values(2,'2019-12-25 11:03');
insert into T20191105 values(3,'2019-12-25 11:05');
insert into T20191105 values(4,'2019-12-25 11:09');
insert into T20191105 values(5,'2019-12-25 11:17');
insert into T20191105 values(6,'2019-12-25 11:19');
insert into T20191105 values(7,'2019-12-25 11:29');
insert into T20191105 values(8,'2019-12-25 11:37');
--SQL Server解法
select * from T20191105;
SELECT T.时间段 , T.行数
FROM (
SELECT DATEADD(mi,(DATEDIFF(mi,CONVERT(VARCHAR(10),DATEADD(ss,1,Times),120),DATEADD(ss,1,Times))/15)*15,CONVERT(VARCHAR(10),Times,120)) AS '时间段',
COUNT(*) AS '行数'
FROM T20191105
GROUP BY DATEADD(mi,(DATEDIFF(mi,CONVERT(VARCHAR(10),DATEADD(ss,1,Times),120),DATEADD(ss,1,Times))/15)*15,CONVERT(VARCHAR(10),Times,120))
) T
答案解析
这里主要是分组的这个函数改怎么理解。为了大家看的更加清楚明白,我们把这其中的每个函数都单独拆分开给大家看看
1、SELECT DATEADD(ss,1,times) FROM T20191105
2、SELECT CONVERT(VARCHAR(10),DATEADD(ss,1,times),120) FROM T20191105
3、SELECT (DATEDIFF(mi,CONVERT(VARCHAR(10),DATEADD(ss,1,times),120),DATEADD(ss,1,times))/15)*15 FROM T20191105
4、SELECT CONVERT(VARCHAR(10),times,120) FROM T20191105
5、SELECT DATEADD(mi,(DATEDIFF(mi,CONVERT(VARCHAR(10),DATEADD(ss,1,times),120),DATEADD(ss,1,times))/15)*15,CONVERT(VARCHAR(10),times,120)) FROM T20191105
结果如下:

这里最重要的就是第3个函数转换DATEDIFF,它是首先将times的完整时间DATEADD(ss,1,times)减去times的日期部分。
CONVERT(VARCHAR(10),DATEADD(ss,1,times),最后就得到了时间部分,然后将时间按分钟进行换算,得出一个整数。
我们知道在SQL中整数除以15最后还是整数,会自动直接舍弃小数部分。
其实关键就是要舍弃这个小数部分,这样我们再乘以15就可以得到times最接近的15分钟是那一刻了。再将这个时刻对应的整数转换成时间类型,就是第5部我们得到内容了。
--MySQL解法
SELECT
FROM_UNIXTIME(t.unit_time* 900, '%Y-%m-%d %H:%i:%s') Times,
t.cnt
FROM
(
SELECT
FLOOR(UNIX_TIMESTAMP(Times) / 900) asunit_time,
count(ID) cnt
FROMT20191105
GROUP BYunit_time
) t;
答案解析
这里是利用对时间格式化后进行分组求个数,其中子查询里面是解题的关键,先将带时间的日期通过UNIX_TIMESTAMP格式化成秒。
然后除以900秒后用FLOOR向下取整得到一个整数,这样就可以得到一个按15分钟分组的时间序列,
再通过FROM_UNIXTIME将unit_time转化成带时间的日期格式即可实现题目中的要求。
·················END·················
推荐一下我的小报童《SQL145题》,集合了145道日常工作中遇到的面试题和笔试题,所有题目均通过测试,目前买断价仅需10元,分享他人购买还可挣5元佣金,长按下方二维码即可订阅。