본문 바로가기
Database/MySQL

날짜&시간 데이터 다루기

by 컴돈AI 2024. 3. 12.

목차

날짜&시간

  • MySQL의 날짜&시간 Data Type
    • DATETIME에서 DATETIME(6) 처럼 숫자를 기입하게 되면 소수점 6자리인 0.000000초까지 저장해줍니다. 
      • 최대 6까지만 입력이 가능합니다.
  • 날짜 & 시간 데이터를 입력할때는 문자처럼 기입하면 됩니다.
    • DATE : 연-월-일 형태 
      • DATE 입력 예시
        • INSERT INTO newtable (날짜2) VALUES ("2024-01-01")
    • DATETIME : 연-월-일 시:분:초 형태
      • DATATIME 입력 예시 
        • INSERT INTO newtable (날짜) VALUES ("2024-01-01 12:05:00")

비교연산자

  •  비교연산자
    • 등호, 부등호를 사용해서 원하는 DATETIME 자료를 가져올 수 있습니다.
      • SELECT * FROM blog WHERE 발행일 > '2022-03-10 08:24:25'
      • SELECT * FROM blog WHERE 발행일 = '2022-03-10 08:24:25'

    • 특정 날짜의 데이터 가져오기
      • SELECT * FROM blog 
        WHERE 발행일 >= '2022-03-10 00:00:00' 
          AND 발행일 < '2022-03-11 00:00:00'

      • BETWEEN은 왼쪽 오른쪽 값을 모두 포함하는 이상,이하이기때문에 2022-03-11 00:00:00 데이터가 포함될 수 있습니다.
        • 만약 이를 방지하기 위해 다음과 같이 BETWEEN '2022-03-10 00:00:00' AND '2022-03-10 23:59:59' 같이 지정해도 되지만, MySQL은 시간을 ms 단위까지 저장하기 때문에 2022-03-10 23:59:59.529 초 같은 데이터가 빵구날 수가있습니다.
      • 아래처럼 date를 통해서 비교할수도 있는데 (date()안에 데이터를 넣으면 DATETIME -> DATE 형식으로 바꿔줍니다.) 이렇게 할 경우 index를 못 쓰는 방법이라 느릴 수 있습니다.
        • SELECT * FROM blog WHERE date(발행일) = '2022-03-10'
    • 특정날짜부터 현재시간까지 발행된 글들만 가져오기
      • SELECT * FROM blog 
        WHERE 발행일 > '2022-03-10 00:00:00' 
          AND 발행일 <= now()
        • now() 안에는 datetime(6)처럼 초단위 소수점 몇째짜리까지 알려주게 됩니다.
      • 아래처럼 하게 될면 안될까요? -> 데이터베이스에는 미래 시간이 기록될 수도 있기때문에 항상 정확하게 조건을 주는 것이 좋습니다.
        • SELECT * FROM blog 
          WHERE 발행일 > '2022-03-10 00:00:00'

날짜 포맷 변경하기

  • DATETIME에 있는 년,월,일,시,분,초 정보를 이용하여 varchar로 변경해서 출력해줄 수 있습니다.
    • %Y : 년도
    • %m : 월
    • %d : 일
    • %H : 시
    • %i : 분
    • %s : 초
  • 예시
    • SELECT date_format(now(), '현재는 %Y년도 %m월 %d일 %H시 %i분 %s초 입니다.')

시간 더하고 빼기

  • INTERVAL 이용하기
    • INTERVAL 기간
      • YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
      • YEAR_MONTH, DAY_SECOND
    • 예시
      • NOW() + INTERVAL 1 YEAR
        • 1년후 날짜 출력
      • NOW() - INTERVAL 1 MONTH
        • 1달전 날짜 출력
      • NOW() + INTERVAL 3 DAY
        • 3일후 날짜 출력
      • NOW() + INTERVAL "1-2" YEAR_MONTH + INTERVAL "5 1:10:30" DAY_SECOND
        • 현재시간으로부터 1년 2개월 5일 1시간 10분 30초 뒤의 날짜를 출력해줍니다.

DATETIME 분리하기

  • DATETIME은 다음 함수들을 이용하여 년도, 월, 일, 시, 분, 초을 분리할 수 있습니다.
    • YEAR() , MONTH(), DAY(), HOUR(), MINUTE(), SECOND()
    • 예시
      • YEAR (NOW()) 
      • SECOND(NOW())

예제

  • login_record.csv
    • id, first_name, email, last_login 정보가 있는 테이블 (어떤 사이트의 유저의 이름, 이메일, 9월부터 11월까지의 마지막 접속시간(DATETIME)이 저장된 테이블)
  • 2022년 11월에 최소 1회 접속한 유저의 수를 구해보기
    • SELECT COUNT(*) FROM login_record 
      WHERE last_login>="2022-11-01 00:00:00" AND last_login<"2022-12-01 00:00:00"
  • 현재 테이블의 모든 날짜 시간에 1년을 더해서 출력하기
    • SELECT last_login + INTERVAL 1 YEAR FROM login_record;
  • 9월의 짝수일에 해당하는 행만 출력하기
    • SELECT * FROM login_record 
      WHERE MONTH(last_login)=9 AND DAY(last_login)%2=0

출처