부울, 문자, 숫자, 임시, 배열, json, uuid 및 특수 유형을 포함한 PostgreSQL 데이터 유형

 

Boolean

- 참, 거짓, null

- 1, yes, y, t, true -> true

- 0, no, flase, f -> false

true false
‘t’ ‘f ‘
‘true’ ‘false’
‘y’ ‘n’
‘yes’ ‘no’
‘1’ ‘0’
CREATE TABLE stock_availability (
   product_id INT PRIMARY KEY,
   available BOOLEAN NOT NULL
);
INSERT INTO stock_availability (product_id, available)
VALUES
	(100, TRUE),
	(200, FALSE),
	(300, 't'),
	(400, '1'),
	(500, 'y'),
	(600, 'yes'),
	(700, 'no'),
	(800, '0');
SELECT *
FROM stock_availability
WHERE available = 'yes';

Character

  • CHAR(n) : 공백이 채워진 고정 길이 문자입니다. 열 길이보다 짧은 문자열을 삽입하면 PostgreSQL이 공백을 채웁니다. 열 길이보다 긴 문자열을 삽입하면 PostgreSQL에서 오류가 발생합니다.
  •  VARCHAR(n) : 가변 길이 문자열입니다. 를 사용하면 VARCHAR(n)최대 n문자를 저장할 수 있습니다 . PostgreSQL은 저장된 문자열이 열의 길이보다 짧을 때 공백을 채우지 않습니다.
  •  TEXT : 가변 길이 문자열입니다. 이론적으로 텍스트 데이터는 길이가 무제한인 문자열입니다.
CREATE TABLE character_tests (
	id serial PRIMARY KEY,
	x CHAR (1),
	y VARCHAR (10),
	z TEXT
);
INSERT INTO character_tests (x, y, z)
VALUES(	'Y','varchar(n)','This is a very long text for the PostgreSQL text column'
	);

Numeric

정수

PostgreSQL에는 세 가지 종류의 정수가 있습니다.

  • 작은 정수( SMALLINT)는 -32,768에서 32,767 사이의 범위를 갖는 2바이트 부호 있는 정수입니다.
  • 정수( INT)는 -2,147,483,648에서 2,147,483,647 사이의 4바이트 정수입니다.
  • Serial 은 PostgreSQL이 자동으로 값을 생성하여 SERIAL열에 채운다는 점을 제외하고 정수와 동일합니다 . 이것은 AUTO_INCREMENT MySQL의 AUTOINCREMENT 열 또는 SQLite의 열과 유사합니다 .

부동 소수점 숫자

부동 소수점 숫자에는 세 가지 주요 유형이 있습니다.

  • float(n)  정밀도가 최소 n, 최대 8바이트인 부동 소수점 숫자입니다.
  • real또는 float84바이트 부동 소수점 숫자입니다.
  • numeric 또는 numeric(p,s) 소수점 뒤에 s가 있는 p 자리의 실수입니다.  numeric(p,s)는 정확한 숫자입니다.
DROP TABLE IF EXISTS products;

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    price NUMERIC(5,2)
);
INSERT INTO products (name, price)
VALUES ('Phone',500.215), 
       ('Tablet',500.214);

 

UPDATE products
SET price = 'NaN'
WHERE id = 1;
반응형

Temporal data types

시간 데이터 유형을 사용하면 날짜 및/또는 시간 데이터를 저장할 수 있습니다. 

  • DATE날짜만 저장합니다.
  • TIME시간 값을 저장합니다.
  • TIMESTAMP날짜와 시간 값을 모두 저장합니다.
  • TIMESTAMPTZ시간대 인식 타임스탬프 데이터 유형입니다. 시간대가 있는 타임스탬프 의 약어입니다 .
  • INTERVAL 기간을 저장합니다.

TIMESTAMPTZ은 표준 SQL의 시간 데이터 유형에 PostgreSQL을의 확장입니다.

 

1) DATE

DROP TABLE IF EXISTS employees;

CREATE TABLE employees (
	employee_id serial PRIMARY KEY,
	first_name VARCHAR (255),
	last_name VARCHAR (355),
	birth_date DATE NOT NULL,
	hire_date DATE NOT NULL
);

INSERT INTO employees (first_name, last_name, birth_date, hire_date)
VALUES ('Shannon','Freeman','1980-01-01','2005-01-01'),
	   ('Sheila','Wells','1978-02-05','2003-01-01'),
	   ('Ethel','Webb','1975-01-01','2001-01-01');

 

-- 현재 시간
SELECT NOW()::date;

 

-- 특정 포맷
SELECT TO_CHAR(NOW() :: DATE, 'dd/mm/yyyy');

 

-- 두 기간 사이
SELECT
	first_name,
	last_name,
	now() - hire_date as diff
FROM
	employees;

 

-- 특정일까지의 나이 계산
SELECT
	employee_id,
	first_name,
	last_name,
	age('2021-01-01',birth_date)
FROM
	employees;

 

-- 특정 값 추출
SELECT
	employee_id,
	first_name,
	last_name,
	EXTRACT (YEAR FROM birth_date) AS YEAR,
	EXTRACT (MONTH FROM birth_date) AS MONTH,
	EXTRACT (DAY FROM birth_date) AS DAY
FROM
	employees;

 

2) TIMESTAMP

CREATE TABLE timestamp_demo (
    ts TIMESTAMP, 
    tstz TIMESTAMPTZ
);
SET timezone = 'America/Los_Angeles';

-- 다음으로 확인가능
SHOW TIMEZONE;

 

INSERT INTO timestamp_demo (ts, tstz)
VALUES('2016-06-22 19:10:25-07','2016-06-22 19:10:25-07');



SELECT 
   ts, tstz
FROM 
   timestamp_demo;

 

3) INTERVAL

@ interval [ fields ] [ (p) ]
SELECT
	now(),
	now() - INTERVAL '1 year 3 hours 20 minutes' 
             AS "3 hours 20 minutes ago of last year";

 

-- 간격 연산자
SELECT
INTERVAL '2h 50m' + INTERVAL '10m'; -- 03:00:00

SELECT
INTERVAL '2h 50m' - INTERVAL '50m'; -- 02:00:00

SELECT
600 * INTERVAL '1 minute'; -- 10:00:00

 

-- 문자열 전환
SELECT
    TO_CHAR(
        INTERVAL '17h 20m 05s',
        'HH24:MI:SS'
    );

 

-- 간격에서 추출
SELECT
    EXTRACT (
        MINUTE
        FROM
            INTERVAL '5 hours 21 minutes'
    );

 

4) TIME

HH:MI   
HH:MI:SS
HHMISS
--
01:02
01:02:03
010203


---

MI:SS.pppppp    
HH:MI:SS.pppppp
HHMISS.pppppp
--
04:59.999999
04:05:06.777777
040506.777777

 

CREATE TABLE shifts (
    id serial PRIMARY KEY,
    shift_name VARCHAR NOT NULL,
    start_at TIME NOT NULL,
    end_at TIME NOT NULL
);

 

INSERT INTO shifts(shift_name, start_at, end_at)
VALUES('Morning', '08:00:00', '12:00:00'),
      ('Afternoon', '13:00:00', '17:00:00'),
      ('Night', '18:00:00', '22:00:00');

 

-- 현재 시간 가져오기
SELECT CURRENT_TIME;

-- 현지 시간 가져오기
SELECT LOCALTIME;

 

-- 시간대 변환 
[TIME with time zone] AT TIME ZONE time_zone

SELECT LOCALTIME AT TIME ZONE 'UTC-7';

 

-- 시간 값에서 시 분 초 추출
EXTRACT(field FROM time_value);

SELECT
    LOCALTIME,
    EXTRACT (HOUR FROM LOCALTIME) as hour,
    EXTRACT (MINUTE FROM LOCALTIME) as minute, 
    EXTRACT (SECOND FROM LOCALTIME) as second,
    EXTRACT (milliseconds FROM LOCALTIME) as milliseconds;

 

-- 시간 값에서 산술 연산
SELECT time '10:00' - time '02:00' AS result;

SELECT LOCALTIME + interval '2 hours' AS result;
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기