문자열로 입력된 날짜를 임시로 만들고 년/월/일을 짤라놓은 뒤 || 을 이용해 년 월 일을 '-'로 연결한 뒤,다시 DATE타입으로 바꾸어 연산해보는 공부

  • 칼럼을 생성하고 싶다면 : SELECT절에서  값 AS 칼럼명
  • timestamp 1개로 년/월/일 3개로 나누기 : TOCHAR_( date or timestamp, ' date 기호 ')
  • || : SELECT절에서 문자열칼럼 or 생성한문자열 을 concat해준다.
  • 둘다 DATE타입일 경우, 마이너스 연산이 가능하다. 연산결과는 n days + 시간 -> int로 캐스팅해야 숫자로 사용( 나누기 365 등)할 수 있다.
  • PosgreSQL에서 birthday를 만나이로 계산하는 순서(년/월/일)로 나뉘어있다고 가정
    (1) || 을 통해 YYYY-MM-DD형태로 변환
    (2) DATE타입으로 캐스팅
    (3) NOW()현재날짜와 (-) 연산
    (4) int타입으로 캐스팅
    (5) /365해주기

  • MSSQL에서 birthday를 만나이로 계산하는 순서( YYYY-MM-DD)로 나뉘었다고 가정 :
    (1) DATEDIFF( day, 시작날짜, GETDATE()) / 365자동연산


전처리

  1. 기존 테이블
  1. SELECT에 < 한개의자료 AS 칼럼명 > 으로 새 칼럼을 생성한 뒤, INTO로 테이블 생성

    • '문자열' AS 칼럼명 (text형으로 칼럼생성)
    • NOW() AS 칼럼명 (timestamp형로 칼럼생성) 등등.. 다된다.
      SELECT *, NOW() AS time INTO students_with_birthday FROM students;
      
  2. time칼럼에 날짜 입력해주기

    UPDATE students_with_birthday SET time = '1987-01-30' WHERE name ='Moe';
    UPDATE students_with_birthday SET time = '1988-03-29' WHERE name ='Larry';
    UPDATE students_with_birthday SET time = '1980-02-28' WHERE name ='Rolf';
    UPDATE students_with_birthday SET time = '1987-06-27' WHERE name ='Anne';
    UPDATE students_with_birthday SET time = '1991-02-26' WHERE name ='Robert';
    UPDATE students_with_birthday SET time = '1958-01-26' WHERE name ='Jose';
    

  1. 날짜(YYYY-MM-DD)를 문자열 & 년/월/일 로 분리하여 칼럼 만들고, 확인되면 INTO 넣어서 필요한 칼럼들만으로 테이블로 만들기
    SELECT *,
     TO_CHAR(time, 'YYYY') as year_of_birth, 
     TO_CHAR(time, 'MM') as month_of_birth, 
     TO_CHAR(time, 'DD') as day_of_birth 
    FROM students_with_birthday
    
    SELECT name, current_mood,
     TO_CHAR(time, 'YYYY') as year_of_birth, 
     TO_CHAR(time, 'MM') as month_of_birth, 
     TO_CHAR(time, 'DD') as day_of_birth 
    INTO students_birthday
    FROM students_with_birthday
    SELECT * FROM students_birthday
    

문자열인 년/월/일 칼럼을 || 과 sep '-'로 붙히는 연습해보기

  1. 문자열칼럼 || '문자열' or 문자열 칼럼
    SELECT year_of_birth  FROM students_birthday                         -- 2019
    SELECT year_of_birth||'-'  FROM students_birthday                     -- 2019-
    SELECT year_of_birth||'-'||month_of_birth  FROM students_birthday            -- 2019-02 
    SELECT year_of_birth||'-'||month_of_birth||'-'||day_of_birth FROM students_birthday     -- 2019-02-01
    
  1. 문자열 YYYY || MM || DD 를 concat(||)으로 붙힌 것을 CAST( AS DATE)으로 타입 변환하기 ( YYYY-MM-DD 형태 아니면 안됨 )

    SELECT CAST( year_of_birth||'-'||month_of_birth||'-'||day_of_birth AS DATE),* FROM students_birthday 
    
  2. date타입으로 바꿨으면, 특정시간칼럼과 연산이 가능하다.

    SELECT NOW() - CAST( year_of_birth||'-'||month_of_birth||'-'||day_of_birth AS DATE) FROM students_birthday 
    

  3. 날짜(둘다 DATE여야함.) 차이결과는 days +시간으로 나온다. 이것을 int로 다시 형변환하면, day숫자만 나온다. * NOW()는 date가 아니라 timestamp로서 다른 타입이니 또 캐스팅

    SELECT CAST( CAST(NOW() AS DATE) - CAST( year_of_birth||'-'||month_of_birth||'-'||day_of_birth AS DATE)  AS INT) FROM students_birthday 
    
  4. day를 /365 로 나누면, 만나이(년수)가 나온다.

    SELECT CAST( CAST(NOW() AS DATE) - CAST( year_of_birth||'-'||month_of_birth||'-'||day_of_birth AS DATE)  AS INT) / 365 FROM students_birthday 
    


+ Recent posts