Open jeeyeonLIM opened 4 years ago
YEAR : 연
QUARTER : 분기
MONTH : 월
WEEK : 주
DAY : 일
HOUR : 시
MINUTE : 분
SECOND : 초
단일 날짜 연산
## PLUS
DATE_ADD(날짜, INTERVAL 1 YEAR)
DATE_ADD(날짜, INTERVAL 1 MONTH)
DATE_ADD(날짜, INTERVAL 1 DAY)
DATE_ADD(날짜, INTERVAL 1 HOUR)
DATE_ADD(날짜, INTERVAL 1 MINUTE)
DATE_ADD(날짜, INTERVAL 1 SECOND)
DATE_SUB(날짜, INTERVAL 2 YEAR)
- 두 날짜간 연산
```sql
DATEDIFF(날짜2, 날짜1) # 날짜1 < 날짜2
TIMESTAMPDIFF(WEEK, 날짜1, 날짜2) #DAY, MONTH, YEAR,... 변환 가능!
https://programmers.co.kr/learn/courses/30/lessons/59411
요일 계산
dayname('2019-01-01')
SELECT A.ANIMAL_ID, A.NAME, A.DATETIME AS A_DATETIME, B.DATETIME AS B_DATETIME,
DATE_ADD( B.DATETIME, INTERVAL 1 YEAR ) AS DATE_ADD,
DATEDIFF( B.DATETIME, A.DATETIME) AS DATEDIFF,
TIMESTAMPDIFF(SECOND, A.DATETIME, B.DATETIME) AS TIMESTAMPDIFF,
DAYNAME(A.DATETIME) AS DAYNAME
FROM ANIMAL_INS A
LEFT OUTER JOIN (SELECT ANIMAL_ID, DATETIME FROM ANIMAL_OUTS) AS B
ON A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY DATEDIFF( B.DATETIME, A.DATETIME) DESC # 날짜 차이 기준으로 내림차순 정렬
![image](https://user-images.githubusercontent.com/45617225/83777035-e4761980-a6c3-11ea-8a3d-4bbb146140d3.png)
### 일부 추출
- year 만 추출
- ```date_part('year',concat_ws('-',substr(dt,1,4),substr(dt,5,2),substr(dt,7,2))) as years```
- ```from_timestamp(date_trunc('week',concat_ws('-',substr(dt,1,4),substr(dt,5,2),substr(dt,7,2))),'yyyy-MM-dd' ) as stdt```
- week 단위로 끊어서 한 주 시작일자만을 남기고 싶을 때 사용
```sql
SELECT A.DATETIME,
YEAR(A.DATETIME), MONTH(A.DATETIME), DAY(A.DATETIME),
HOUR(A.DATETIME), MINUTE(A.DATETIME), SECOND(A.DATETIME)
FROM ANIMAL_INS A
LEFT OUTER JOIN (SELECT ANIMAL_ID, DATETIME FROM ANIMAL_OUTS) AS B
ON A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY DATEDIFF( B.DATETIME, A.DATETIME) DESC # 날짜 차이 기준으로 내림차순 정렬
DATE_FORMAT
CONCAT_WS
+ SUBSTR
SELECT DATETIME,
DATE_FORMAT(DATETIME, '%Y-%m-%d') AS DATE_FORMAT,
CONCAT_WS('-',SUBSTR(DATETIME,1,4),SUBSTR(DATETIME,6,2),SUBSTR(DATETIME,9,2)) AS CONCAT_WS,
CONCAT(SUBSTR(DATETIME,1,4),'-',SUBSTR(DATETIME,6,2),'-',SUBSTR(DATETIME,9,2)) AS CONCAT
FROM ANIMAL_INS
![image](https://user-images.githubusercontent.com/45617225/83780888-ba732600-a6c8-11ea-9c91-8e3e2e2754e8.png)
### 비교
- DATETIME 형태를 DATE_FORMAT 함수 이용해서 '%Y-%m-%d' 형태로 바꿔준 뒤 비교 ~
```sql
SELECT A.ANIMAL_ID, A.DATETIME, B.DATETIME, DATE_FORMAT(A.DATETIME,'%Y-%m-%d'),
IF(DATE_FORMAT(A.DATETIME,'%Y-%m-%d')<='2016-04-21',1,0)
FROM ANIMAL_INS A
LEFT OUTER JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.DATETIME > B.DATETIME
1. RANK() OVER(partition by 변수명, order by)
DENSE_RANK() OVER(partition by 변수명, order by)
ROW_NUMBER() OVER(partition by 변수명, order by)
RANK() OVER (PARTITION BY user_id ORDER BY count(distinct product_id) desc) as rk
like
써서 비교where 변수명 regexp '검사할문자1|검사할문자2
where (변수명 like '%검사할문자1') or (변수명 like '%검사할문자2)
select animal_id, name,
#if((sex_upon_intake like '%Neutered%')or( sex_upon_intake like'%Spayed%'),'O','X') as 중성화
if( sex_upon_intake regexp 'Neutered|Spayed' ,'O','X') as 중성화
from animal_ins order by animal_id
### regexp 사용 시 정규식
- **`^`** : st로 시작하는 row찾기
```sql
SELECT 변수 FROM 테이블 WHERE name REGEXP '^st';
$
: end로 끝나는 row 찾기
SELECT 변수 FROM 테이블 WHERE name REGEXP 'end$';
''
: jeeyeon이 포함된 row 찾기
SELECT 변수 FROM 테이블 WHERE name REGEXP 'jeeyeon';
cast(문자변수 as unsigned) # 문자변수 -> 숫자변환
cast(문자변수 as char) # 숫자변수 -> 문자변환
SELECT ANIMAL_ID,ANIMAL_TYPE, lag(ANIMAL_ID,1) over(partition by ANIMAL_TYPE)
FROM ANIMAL_INS
WITH ROLLUP
SELECT ANIMAL_TYPE,SEX_UPON_INTAKE, COUNT(*) AS COUNT
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE,SEX_UPON_INTAKE WITH ROLLUP
목적
목차