- 날짜 데이터는 일반 int처럼 + 1로 값이 변하지 않는다. ex) 2025-01-10에 +1 해도 2025-01-11이 되지 않는다는 것
따라서, 기준 날짜에서 시간을 더하고 싶으면 DATE_ADD(기준 날짜, INTERVAL) 형식으로 쿼리 작성
SELECT DATE_ADD(NOW(), INTERVAL 1 SECOND)
SELECT DATE_ADD(NOW(), INTERVAL 1 MINUTE)
SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR)
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY)
SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH)
SELECT DATE_ADD(NOW(), INTERVAL 1 YEAR)
SELECT DATE_ADD(NOW(), INTERVAL -1 YEAR) #이렇게 빼기도 가능
날짜를 빼고 싶으면 DATE_SUB(기준 날짜, INTERVAL)
SELECT DATE_SUB(NOW(), INTERVAL 1 SECOND)
- Leetcode 예제
이전글에 이어서, self join도 하고 datetime 데이터도 다룰 수 있는 문제
https://leetcode.com/problems/rising-temperature/
Table: Weather
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| recordDate | date |
| temperature | int |
+---------------+---------+
id is the column with unique values for this table.
There are no different rows with the same recordDate.
This table contains information about the temperature on a certain day.
Write a solution to find all dates' id with higher temperatures compared to its previous dates (yesterday).
Return the result table in any order.
The result format is in the following example.
Example 1:
Input:
Weather table:
+----+------------+-------------+
| id | recordDate | temperature |
+----+------------+-------------+
| 1 | 2015-01-01 | 10 |
| 2 | 2015-01-02 | 25 |
| 3 | 2015-01-03 | 20 |
| 4 | 2015-01-04 | 30 |
+----+------------+-------------+
Output:
+----+
| id |
+----+
| 2 |
| 4 |
+----+
Explanation:
In 2015-01-02, the temperature was higher than the previous day (10 -> 25).
In 2015-01-04, the temperature was higher than the previous day (20 -> 30).
문제 해설
- recodeDate는 날짜 데이터 형식, 어제보다 높은 기온을 가진 모든 날짜를 찾아라.
접근 방식
1. 한 행에 어제와 오늘의 날짜, 기온이 함께 들어가있어야 하므로 한 칸 씩 밀리도록 inner join을 해야함
2. 두 개의 동일한 테이블을 각 today, yesterday라고 이름 붙이고, join 기준에는 날짜 데이터에 맞는 date_add를 사용
>> 처음에는 id가 1,2,3,.. 에 따라 날짜도 01-01, 01-02, 01-03인줄 알고, id를 기준으로 +1 의 수식을 넣어 조인했으나 제출결과 wrong이었음
>> leetcode에서 꼼수 쓰지 못하도록 test data에는 id와 recordDate의 순서가 다른게 있었기 때문에 날짜 데이터를 기준으로 조인해야만 함
3. where문에 기온 조건 달아주기
4. 출력은 today의 id만
최종 코드
SELECT today.id
FROM Weather AS today
INNER JOIN Weather AS yesterday ON DATE_ADD(yesterday.recordDate, INTERVAL 1 DAY) = today.recordDate
WHERE yesterday.temperature < today.temperature
'SQL' 카테고리의 다른 글
LeetCode 문제 풀이 기록 (0) | 2025.01.15 |
---|---|
MySQL 숫자, 문자열 다루는 함수 정리 (0) | 2025.01.15 |
SELF JOIN + 리트코드 예제 (0) | 2025.01.10 |
CASE를 활용한 테이블 피봇 + 리트코드 예제 (0) | 2025.01.09 |
DATETIME, DATE_FORMAT (1) | 2024.11.19 |