题目描述

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

相关知识

  1. 日期处理

    • 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)改变日期的显示方式

解题过程

  1. 分析题意

    • 将两个Weather进行内连接,条件是今天和前一天的进行拼接
    • 比较两者的temperature,如果后一天的大,则返回id
  2. 编写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是直接将间隔符去掉,所以不会有月份的进制转换
  3. 改用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
    
  4. 提交,运行通过

学习总结

  1. 对于Date这种SQL支持的数据类型,官方一般都会有相应的处理函数,只是要注意各个数据库处理这些数据时的函数名可能会不一样