프로그래밍 언어/SQL

SQL 함수 간단 실습 :: 시간/날짜 관련 함수

gamjadori 2024. 1. 24. 17:41
728x90

<시간/날짜 관련 함수>

  • CURRENT_DATE, CURDATE: 현재 날짜 반환
  • CURRENT_DATE, CURTIME: 현재 시간 반환
  • CURRENT_TIMESTAMP, NOW: 현재 시간과 날짜 반환 (1900)
  • SELECT CURDATE(), CURTIME(), NOW();
  • DATE(): 문자열을 날짜로 생성
  • TIME(): 문자열을 시간으로 생성
SELECT * FROM orders
WHERE orderdate BETWEEN DATE('1997-1-1') AND DATE('1997-1-31');
>> '1997-1-1'을 날짜로 생성한 것과 '1997-1-31'을 날짜로 생성한 기간 사이에 있는
orders 테이블의 모든 항목을 출력하시오.

<결과>

<날짜 표현 함수>

  • YEAR, MONTHNAME, MONTH, WEEKDAY, DAYNAME 년, 월, 일...
SELECT orderdate,
    YEAR(orderdate) as 'YEAR',
    MONTHNAME(orderdate) as 'MONTHNAME',
    MONTH(orderdate) as 'MONTH',
    WEEKDAY(orderdate) as 'DAYNAME',
    DAYNAME(orderdate) as 'DAY',
    DAY(orderdate) as 'DAY'
FROM orders;
>> orders에서 orderdate의 년도를 'YEAR'
orderdate의 영문 월 이름을 'MONTHNAME'
orderdate의 월을 'MONTH'
orderdate의 요일값(숫자)을 'DAYNAME'
orderdate의 요일명을 'DAY'
orderdate의 날짜(일)를 'DAY'로 출력하시오.

<결과>

SELECT 
'2021-6-1' = '2021-06-01',
DATE('2021-6-1') = DATE('2021-06-01'),
'1:2:3' = '01:02:03',
TIME('1:2:3') = TIME('01:02:03');
>> '2021-6-1' = '2021-06-01'는 날짜로 생성되지 않아 다른 것으로 판단하고
DATE('2021-6-1') = DATE('2021-06-01')는 날짜로 생성되어
'2021-06-01'가 되므로 같다고 판단함.
'1:2:3' = '01:02:03'는 시간으로 생성되지 않아 다르다고 판단하고
TIME('1:2:3') = TIME('01:02:03')는 '01:02:03'으로 생성되어
같다고 판단

<결과>

<날짜 계산>

  • 날짜 계산은 꼭 날짜 계산 함수 이용
  • ADDDATE(대상, INTERVAL 기간): 시간/날짜를 더하기
  • SUBDATE(대상, INTERVAL 기간):: 시간/날짜를 빼기
SELECT
    ADDDATE('2024-01-05', INTERVAL 1 YEAR),
    ADDDATE('2024-01-05', INTERVAL -2 MONTH),
    ADDDATE('2024-01-05', INTERVAL 3 WEEK),
    ADDDATE('2024-01-05', INTERVAL -5 DAY),
    ADDDATE('2024-01-05', INTERVAL -5 MINUTE),
    ADDDATE('2024-01-05 13:01:12', INTERVAL 6 SECOND);
>> '2024-01-05'에서 1년을 더하고,
'2024-01-05'에서 -2월을 더하고 (빼기)
'2024-01-05'에서 3주를 더하고
'2024-01-05'에서 -5를 더하고
'2024-01-05'에서 -5분을 더하고 >> 24:00:00에서 계산
'2024-01-05 13:01:12'에서 6초를 더하기.

<결과>

SELECT orderdate,
    ADDDATE(orderdate, INTERVAL 1 YEAR),
    ADDDATE(orderdate, INTERVAL -2 MONTH),
    ADDDATE(orderdate,INTERVAL 3 WEEK),
    ADDDATE(orderdate, INTERVAL -5 DAY)
FROM orders;
>> orders에서 orderdate와
orderdate에서 1년을 더한 값,
orderdate에서 -2월을 더한 값,
orderdate에서 3주를 더한 값,
orderdate에서 -5를 더한 값을 출력해라.

<결과>

  • DATEDIFF: 두 날짜 간의 차이
  • TIMEDFIFF: 두 시간 간의 차이
  • LASTDAY 해당 월의 마지막 날짜
SELECT orderdate,
    LASTDAY(orderdate),
    DAY(LAST_DAY(orderdate)),
    DATEDIFF(LAST_DAY(orderdate), orderdate)
FROM orders;
>> orders에서 orderdate와
orderdate 항목에 해당하는 마지막 월,
orderdate 항목의 해당하는 마지막 월의 날짜,
orderdate 항목에 해당하는 마지막 월와 orderdate의 날짜 차이를 출력하시오.

<시간/날짜 형식 변환>

  • DATE_FORMAT: 시간/날짜를 지정한 형식으로 반환
  • %Y: 년도 네 자리
  • %y: 년도 두 자리
  • %M: 영문 월
  • %m: 숫자 월
  • %D: 영문 일
  • %d: 숫자 일
  • %T: 시간
  • %p: 오전 / 오후
  • %h: 12시 기준 시
  • %i: 분
  • %s: 초
SELECT DATE_FORMAT(NOW(), '%M %D, %Y %T'),
    DATE_FORMAT(NOW(), '%Y년 %m월 %d일 %T');
>> 현재 날짜의 '영문 월과 영문 일, 년도 네 자리와 시간'
현재 날짜의 '년도 네 자리 숫자 월 숫자 일 시간'을 출력하시오.

<결과>

SELECT REPLACE(
    REPLACE(
        DATE_FORMAT(NOW(), '%Y년 %m월 %d일 %p %h시 %i분 %s초'),
        'AM', '오전'
    ),
    'PM', '오후'
);
>> 현재 시간의 년도 네자리 년도 숫자 월 숫자 일 오전/오후 시 분 초로 표현하고
'AM'을 '오전'으로 바꾸고 'PM'를 '오후'로 대체해라.

<결과>

<날짜 생성 함수> DATE_FORMAT() 의 반대

  • STR_TO_DATE(S,F): S를 F 형식으로 해석해 날짜 생성
  • 문자열을 날짜 형태로 바꿈
  • DATE('2024년 01월 05일 오후 4시 16분 55초') DATE는 특별한 형식의 문날짜 해석 불가
SELECT STR_TO_DATE('2024-05-04 07:48:52', '%Y-%m-%d %T');
>> '2024-05-04 07:48:52'를 '%Y-%m-%d %T'로 생성해라

<결과>

SELECT
    DATEDIFF(
        STR_TO_DATE('2024-06-04 07:48:52', '%Y-%m-%d %T'),
        STR_TO_DATE('2024-January-01 12:48:52', '%Y-%m-%d %T')
    );
>> '2024-January-01 12:48:52' 해석이 안 돼 결과 출력 불가

<결과>