|| ( 문자열 칼럼 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형로 칼럼생성) 등등.. 다된다.1
SELECT
*, NOW()
AS
time
INTO
students_with_birthday
FROM
students;
time칼럼에 날짜 입력해주기
123456UPDATE
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 넣어서 필요한 칼럼들만으로 테이블로 만들기12345
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
1234567SELECT
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 문자열 칼럼 1234
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 형태 아니면 안됨 )
1SELECT
CAST
( year_of_birth||
'-'
||month_of_birth||
'-'
||day_of_birth
AS
DATE
),*
FROM
students_birthday
date타입으로 바꿨으면, 특정시간칼럼과 연산이 가능하다.
1SELECT
NOW() -
CAST
( year_of_birth||
'-'
||month_of_birth||
'-'
||day_of_birth
AS
DATE
)
FROM
students_birthday
날짜(둘다 DATE여야함.) 차이결과는 days +시간으로 나온다. 이것을
int
로 다시 형변환하면, day숫자만 나온다. * NOW()는 date가 아니라 timestamp로서 다른 타입이니 또 캐스팅1SELECT
CAST
(
CAST
(NOW()
AS
DATE
) -
CAST
( year_of_birth||
'-'
||month_of_birth||
'-'
||day_of_birth
AS
DATE
)
AS
INT
)
FROM
students_birthday
day를 /365 로 나누면, 만나이(년수)가 나온다.
1SELECT
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 |