题目描述
表 Weather
(Primary Key: id)
Column Name | Type |
---|---|
id | int |
recordDate | date |
temperature | int |
编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id
。
返回结果不要求顺序 。
Weather
表:
id | recordDate | Temperature |
---|---|---|
1 | 2015-01-01 | 10 |
2 | 2015-01-02 | 25 |
3 | 2015-01-03 | 20 |
4 | 2015-01-04 | 30 |
查询结果格式如下例:
Id |
---|
2 |
4 |
相关知识
-
日期处理
-
GETDATE() 返回当前日期和时间
-
DATEPART(datepart,date)返回日期或时间的单独部分
-
SQL Server:DATEADD(datepart,number,date) 在日期中添加或减去指定的时间间隔
-
Mysql:DATE_ADD(date,INTERVAL expr type)添加 DATE_SUB(date,INTERVAL expr type)减去 指定的时间间隔
-
DATEDIFF(datepart,startdate,enddate)返回两个日期之间的时间
-
CONVERT(date_type(length),expression,style)改变日期的显示方式
-
解题过程
-
分析题意
- 将两个Weather进行内连接,条件是今天和前一天的进行拼接
- 比较两者的temperature,如果后一天的大,则返回id
-
编写sql
SELECT l.id AS id, FROM Weather l, Weather r WHERE (CAST(l.recordDate AS SIGNED)-1=CAST(r.recordDate AS SIGNED)) AND l.Temperature>r.Temperature
- 这个sql在不跨月的时候是正常的,因为CAST将date转变为signed是直接将间隔符去掉,所以不会有月份的进制转换
-
改用SQL Date编写SQL
SELECT l.id AS id FROM Weather l, Weather r WHERE (DATE_SUB(l.recordDate,INTERVAL 1 DAY)=r.recordDate) AND l.Temperature>r.Temperature
-
提交,运行通过
学习总结
- 对于Date这种SQL支持的数据类型,官方一般都会有相应的处理函数,只是要注意各个数据库处理这些数据时的函数名可能会不一样