leetcode 问题 197.温度上升
给定一个天气表,编写一个 SQL 查询以查找与之前(昨天(日期相比温度更高的所有日期的 ID。
+---------+------------------+------------------+
| Id(INT) | RecordDate(DATE) | Temperature(INT) |
+---------+------------------+------------------+
| 1 | 2015-01-01 | 10 |
| 2 | 2015-01-02 | 25 |
| 3 | 2015-01-03 | 20 |
| 4 | 2015-01-04 | 30 |
+---------+------------------+------------------+
For example, return the following Ids for the above Weather table:
+----+
| Id |
+----+
| 2 |
| 4 |
+----+
我不知道函数DATEDIFF()
,所以我写了我的SQL解决方案:
select w1.Id
from Weather w1,Weather w2
where w1.RecordDate - w2.RecordDate = 1
and w1.Temperature > w2.Temperature
我通过了测试用例,但提交错误,正确的解决方案是使用功能DATEDIFF()
select w1.Id
from Weather w1,Weather w2
where DATEDIFF(w1.RecordDate,w2.RecordDate)=1
and w1.Temperature > w2.Temperature
所以我的问题是两者之间有什么区别 DATEDIFF(w1.RecordDate,w2.RecordDate)=1
和w1.RecordDate - w2.RecordDate = 1
谢谢你的帮助
如果RecordDate
的数据类型是DATETIME
而不是DATE
,则减去它们将返回一个大值,其中包含时间和日期之间的差异。 例如
mysql> select cast('2019-03-21 10:20:30' as datetime) - cast('2019-03-11 9:15:20' as datetime) as difference;
+-----------------+
| difference |
+-----------------+
| 10010510.000000 |
+-----------------+
但如果它们是DATE
那么减法应该与DATEDIFF()
相同:
mysql> select cast('2019-03-21' as date) - cast('2019-03-11' as date) as difference;
+------------+
| difference |
+------------+
| 10 |
+------------+
当我们对日期或日期时间进行简单的加法和减法时,它会将其转换为数字,然后执行实际操作。操作执行后,输出将不是日期数据类型。
例如
<小时 />对于加法 (+( : -
'2020-07-31' + 1 => 20200732
<小时 />对于减法 (-( : -
'2020-08-01' - '2020-07-31' => 70
<小时 />它应该返回 1,但由于他们认为它是一个数字,所以他们返回 70 而不是 1。
这就是我们不能在日期上直接加法或减法的原因。
要获得两个日期之间的实际差异,必须使用 DateDiff((。
Datediff(cast('2020-08-01' as Date),Cast('2020-07-31' as Date)) => 1
<小时 />