ASCII, LOWER, LENGTH, CONCAT ...
SQL에서 날짜를 표현하는 방식
문자형 : 'YYYY-MM-DD HH:NN:SS'
숫자형 : 'YYYYMMDDHHNNSS.uuuuuu'
출력 시에 컨텍스트에 다라 문자열 혹은 숫자로 출력
내부적으로는 숫자형으로 저장
DBMS 마다 날짜형 함수의 기능적 차이가 존재할 수 있음.
SYSDATE, NOW
SYSDATE : 현재 시간
NOW : 명령어가 실행된 시간
SELECT NOW() //2021-05-15 14"41"46
SELECT NOW() + 0 //20210515144146
SELECT SYSDATE(), SLEEP(5), SYSDDATE(); //첫번째와 두번째가 다른 시간
SELECT NOW(), SLEEP(5), NOW(); //첫번째와 두번째가 같은 시간
NOW 함수는 날짜형 컬럼의 기본값을 할당하는데 주로 사용
CREATE TABKE movie(
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
created_on DATETIME NOT NULL DEFAULT NOW() // CURRENT_TIMESTAMP()
)
날짜에 대한 산술 연산을 할 경우 주의
SELECT status, shippedDate, orderDate, shippedDate - orderDate AS diff
FROM orders
ORDER BY diff DESC;
2003-12-26 - 2003-10-22 : 204 // 정확한 일수 차이가 나오지 않는다. 그 이유는 산술 연산으로 처리 되어서
20031226 - 20031022 = 204 // 실제 처리는 이렇게 산술식으로 캐스팅 된뒤 처리
이 문제를 해결하기 위해서는 INTERVAL, TIMESTAMPDIFF 사용
INTERVAL 표현식
SELECT DATE(NOW()) + INTERVAL 5 MONTH AS 테스트1
MONTH(NOW()) + INTERVAL 5 MONTH AS 테스트1 // 오동작, NULL 값 나옴
TIME(NOW()) + INTERVAL 5 MONTH AS 테스트1 // 오동작, NULL 값 나옴
...
FROM employees
WHERE birthDate > DATE(NOW()) - INTERVAL 20 YEAR;
만 20세 미만의 직원 검색
TIMESTAMPDIFF 함수
SELECT
TIMESTAMPDIFF(YEAR, '200-08-02', '2021-05-15') // 20
TIMESTAMPDIFF(YEAR, '200-08-02', '2021-08-02') // 21
TIMESTAMPDIFF(YEAR, '200-08-02', '2021-09-15') // 21
SELECT TIMESTAMPDIFF(YEAR, birthDate, DATE(NOW())) AS 만나이
DATE_FORMAT
클라우드 DBMS에서 응용 프로그램이 시간을 저장하면, 사용자의 현지 시간(클라이언트의 시간)이 아니라 서버의 시간이 저장됨.
서버와 클라이언트가 다른 시간대에 있는 경우, 서버에 저장된 시간은 현지 시간으로 변환하여 출력해야함
EX) 서버에서 UTC 시로 저장하고 클라이언트에서 클라이언트 시간대에 맞게 변환(한국 KST)
CATE() 함수를 사용하여 형변환 가능
SELECT CAST(NOW() AS DATE); DATETIME을 DATE로 변환
COALESCE() 함수
SELECT COALESCE(1, NULL)
SELECT COALESCE(NULL, NULL, NULL)
SELECT COALESCE(desc, "*****")
SELECT COALESCE(price, 0)