|| ( 문자열 칼럼 concat)* and DATE (-)연산을 통해 만나이 계산* MSSQL과 비교해보기***
2019. 2. 2. 16:11
문자열로 입력된 날짜를 임시로 만들고 년/월/일을 짤라놓은 뒤 || 을 이용해 년 월 일을 '-'로 연결한 뒤,다시 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 로 자동연산
전처리
- 기존 테이블
SELECT에 < 한개의자료 AS 칼럼명 > 으로 새 칼럼을 생성한 뒤, INTO로 테이블 생성
- '문자열' AS 칼럼명 (text형으로 칼럼생성)
- NOW() AS 칼럼명 (timestamp형로 칼럼생성) 등등.. 다된다.
SELECT *, NOW() AS time INTO students_with_birthday FROM students;
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';
- 날짜(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 '-'로 붙히는 연습해보기
- 문자열칼럼 || '문자열' 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
문자열 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
date타입으로 바꿨으면, 특정시간칼럼과 연산이 가능하다.
SELECT NOW() - CAST( year_of_birth||'-'||month_of_birth||'-'||day_of_birth AS DATE) FROM students_birthday
날짜(둘다 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
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
'한의대 생활 > └ PostgreSQL' 카테고리의 다른 글
SERIAL*( autoincrement 실용적인 대체) (0) | 2019.01.31 |
---|---|
ENUM* (순서를 가진 문자열범주 - ordinal) and NESTED SELECT*(집계결과는 따로받아, 해당테이블 SELECT 칼럼연산 or WHERE조건으로 사용) (0) | 2019.01.31 |
DATE - timestamp (0) | 2019.01.31 |
HAVING* ( group by 결과물의 조건문 ) (0) | 2019.01.30 |
DROP * ( with CASCADE ) and VIEW* ( with LOCAL / CASECADE CHECK OPTION ) (0) | 2019.01.30 |