在学习PB的2周抽了碎片时间复盘了进阶SQL的50题,感觉开头和结尾的题目难度高,中间的题目相对基础些。
考核日期时间函数的题目主要集中在结尾的47-50一共4题,今天收尾也顺便温习了对应的函数知识,笔记整理如下:
知识点:
A. 格式转换型
1. Date(‘20200101’)=2020-01-01 返回指定表达式的日期部分或将文本转为日期格式
2. Date_Format(date, format) 根据format字符串中可用标识符转化date值
B. 返回指定日期特定值型
2. Week(date, mode) 返回指定日期是一年中的第几周
Week(‘2020-01-01’,1) = 1 -- 代表2020-01-01在2020年的第一周
3. Year(date) 返回指定日期的年份
Year(‘20-01-01’)=2020
4. Month(date) 返回指定日期中的月
5. Day(date) 返回指定日期中的日
6. Hour(datetime) 返回指定时间的小时
C. 直接返回特定值(无指定日期)
7. Curdate() 以‘yyyy-mm-dd’或’yyyymmdd’格式返回当前日期值
8. Curtime() 以‘h:mm:ss’或hhmmss格式返回当前时间
9. Now() 以‘yyyy-mm-dd hh:mm:ss’或yyyymmddhhmmss格式返回当前日期&时间
D. 返回天数
10. DateDiff(expr1,expr2) 返回结束日expr1和起始期expr2之间的天数
E.日期时间加减运算
12. 加法 Date_Add(date, interval expr type) = AddDate(date, interval expr type)
13. 减法 Date_Sub(date, interval expr type) = SubDate(date, interval expr type)
(date, interval expr type)解读
- date值: datetime 或 date值
- expr值: 对date进行加减法的一个表达式字符串,例如1 或 -1
- type值: 指明expr的如何被解释
举例: date_add(‘2020-01-01’, interval 1 day); -- 在2020-01-01的基础上加1天
Date_sub(‘2020-01-01’, interval 1 day); -- 在2020-01-01 的基础上减1天
对应练习题:
--47、查询本周过生日的学生
#看看如今是这周的周几(周日为0,周一为1,...):
select date_format(now(),'%w');
#本周的第一天
select date_sub(curdate(),interval date_format(curdate(),'%w') day);
#本周的最后一天
select date_add(curdate(),interval 6-date_format(curdate(),'%w') day);
select *
from stu
where date_format(s_birth,'2020-%m-%d') between date_sub(curdate(),interval date_format(curdate(),'%w') day) and date_add(curdate(),interval 6-date_format(curdate(),'%w') day);
--48、查询下周过生日的学生
#现在离下一周还有多少天?
select 7-date_format(now(),'%w');
#下周的第一天
select date_add(curdate(),interval 7-date_format(curdate(),'%w') day);
#下周的最后一天
select date_add(curdate(),interval 7-date_format(curdate(),'%w')+6 day);
select *
from stu
where date_format(s_birth,'2020-%m-%d') between date_add(curdate(),interval 7-date_format(curdate(),'%w') day) and date_add(curdate(),interval 7-date_format(curdate(),'%w')+6 day);
-- 50. 查询下月过生日的学生
-- 错误写法:
select * from stu where month(s_birth)=month(curdate())+1;
错误缘由:没有考虑如果本月是12月下一个月就返回1月的情况
-- 也是正确但是复杂化的写法
select * from stu where month(s_birth)=if(month(curdate())<12,month(date_add(curdate(), interval 1 month)),1);
-- 参考答案简化写法:
select * from stu where month(s_birth)=if(month(curdate())=12,1,month(curdate())+1);








暂无数据